2012-03-21 103 views
0

我有许多字符串,如“20120117”和“20120321”。我需要用这种格式的新字符串进行转换:“2012/01/17”和“2012/03/21”。那么,有办法做到这一点?将任何字符串格式化为字符串“yyyy/MM/dd”

我尝试:

string dateString = string.format("{0:d", "20120321"); 

string dateString = string.format("{0:yyyy/MM/dd", "20120321"); 

string dateString = int.Parse("20120321").ToString("yyyy/MM/dd"); 

我所有的情况下,我没有达到我的目标。 =/

所以,我可以这样做吗?

OBS:有没有办法做到这一点,而不解析datetime?

+0

我现在不能编码答案,但如果你不喜欢DateTime.Parse的答案,我会考虑写一个正则表达式,甚至使用子串。 – row1 2012-03-21 14:55:04

+0

我认为是这样的: Regex.Replace(“20120117”,“(? \ d {4})(? \ d {2})(? \ d {2})”,“$ {y }/$ {m}/$ {d}“) – row1 2012-03-21 14:58:47

+0

它看起来不像重复 – 2012-03-21 15:04:24

回答

5

你必须在DateTime对象首先是解析这些值。

例子:

DateTime dt = DateTime.ParseExact("20120321", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); 
var result = dt.ToString("yyyy/MM/dd"); 

其他答案你的意见后编辑: 如果你不喜欢解析,因为它可能会抛出excepations,您可以随时使用TryParse,像这样:

DateTime dt; 
bool success = DateTime.TryParseExact("20120321", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt); 
if (success) 
{ 
    var result = dt.ToString("yyyy/MM/dd"); 
} 

编辑2:使用TryParseExact多种格式:

DateTime dt; 
string[] formats = { "yyyyMMdd", "yyyy" }; 

bool success = DateTime.TryParseExact("20120321", formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt); 
if (success) 
{ 
    var result = dt.ToString("yyyy/MM/dd"); 
    Console.WriteLine(result); 
} 

使用2012作为输入值后,会当使用“20120321”作为输入值产生2012/03/21,和2012/01/01

+0

谢谢Shimrod为我展示了所有方法! – 2012-03-21 16:47:28

+0

欢迎您,如果您还有其他问题,请不要犹豫。 – Shimrod 2012-03-22 08:23:31

6
DateTime.ParseExact("20120321", "yyyyMMdd", CultureInfo.CurrentCulture).ToString("yyyy/MM/dd") 

你可以解析字符串,但此方法对验证无需任何额外的代码。想象一下,收到“20120230”,“20110229”或任何其他无效日期。

+0

有没有办法解决日期时间? – 2012-03-21 14:52:00

3

使用DateTime.ParseExact将其转换为DateTime,然后在该实例上使用ToString根据需要进行格式化。

DateTime.ParseExact(dateString, "yyyyMMdd").ToString("yyyy/MM/dd"); 

编辑:使用插入: EDIT2:修正错误:-)

var newString = dateString.Insert(4, "/").Insert(7, "/"); 
+0

有没有办法解决日期时间? – 2012-03-21 14:52:06

+2

你可以使用string.Substring()来做到这一点,但我建议这是最可靠的方法 – Simon 2012-03-21 14:52:38

+0

最后一个索引是7(字符串是不可变的) – 2012-03-21 14:57:03

4

从您的评论:

有一种方法可以做到这一点,而不解析为datetime?

是的,绝对。如果你真的通过您的系统,而不是强调它的不正确传播错误的数据,你肯定可以使用:

// Make sure we'll always be able to get a result whatever the input. 
string paddedInput = input + "????????"; 
string mightBeBadWhoKnows = string.Format("{0}/{1}/{2}", 
    paddedInput.Substring(0, 4), // The year, if we're lucky 
    paddedInput.Substring(4, 2), // The month, if we're lucky 
    paddedInput.Substring(6, 2)); // The day, if we're lucky 

但为什么不会要发现坏的数据?

你绝对是应该解析数据。如果您希望在收到采取适当措施的不良数据后能够继续使用,请使用DateTime.TryParseExact。如果您对抛出异常感到高兴,请使用DateTime.ParseExact。我建议在解析和格式化时使用不变的文化,除非你真的想要一个文化敏感的输出。

+0

如果输入仅与“2012”类似?有一种方法只使用TryParse或类似的东西来做到这一点? (是的,我现在认为这...) – 2012-03-21 14:58:51

+0

@ViniciusOttoni:恐怕不清楚你在问什么。 “如果投入仅仅是2012年”,那么你是什么意思? - 那种情况呢?如果可能的话,我肯定会使用'TryParseExact'。 – 2012-03-21 15:01:03

+2

@ViniciusOttoni:您可以在'TryParseExact'方法中为格式值提供一个字符串数组。所以你可以指定“yyyyMMdd”,“yyyy”或者你想要的值,如果_at至少有一个这种格式匹配,它就会起作用。 – Shimrod 2012-03-21 15:03:45

2

只需使用字符串操作来插入斜线:

string input = "20120321"; 

string dateString = 
    input.Substring(0, 4) + "/" + 
    input.Substring(4, 2) + "/" + 
    input.Substring(6); 

string dateString = input.Insert(6, "/").Insert(4, "/"); 
+0

如果输入只是像“2012”?有一种方法只使用TryParse或类似的东西来做到这一点? (是的,我想现在...) – 2012-03-21 14:59:01

+0

@ViniciusOttoni:你可以检查长度来捕捉这种情况:'if(input.length == 4){dateString = input +“/ 01/01”} else {dateString = ...' – Guffa 2012-03-21 17:04:15

0

如果您的数据总是在相同的格式,如果你不需要验证它,你可以使用下面的代码片段避免用DateTime解析它

var strWithInsert = input.Insert(4,"/").Insert(7,"/"); 
1

如果是日期,请试试这个:

DateTime.ParseExact("20120321","yyyyMMdd", null).ToString("yyyy/MM/dd", System.Globalization.DateTimeFormatInfo.InvariantInfo) 
1

试试这个;

string dateString = DateTime.ParseExact("20120321", "yyyyMMdd", 
           null).ToShortDateString();