2016-09-22 65 views
1

我已经看过一堆关于将字符串解析为DateTime对象的问题,但没有一个像我一样具有相同的格式。我需要解析成一个DateTime对象的字符串格式为:使用月份名称和AM/PM的DateTime字符串转换

2016年6月29日下午12时57
1900年1月1日上午12点

我想要的格式如下:

DateTime.ParseExact(date, "MMM dd yyyy hh:mmtt", CultureInfo.InvariantCulture) 

但是这引发了一个FormatException。有什么建议么?

+0

您能澄清[自定义​​日期和时间格式字符串]的哪一部分(https://msdn.microsoft.com/en-us/library/8kb3ddd4(v = vs.110))。aspx)对日期格式不清楚(比如''d“'与''dd”'区别)? –

+0

请注意,帖子的标题与您遇到的问题完全无关 - 您可能需要重新阅读[MCVE]关于为帖子创建示例代码的指导。 –

+1

检查日期字符串中的尾部空格 – Fabio

回答

2

您可能想查看MSDN上的Custom Date and Time Format Strings页面。我认为你的问题是,你现在的格式需要在你的一天和两个小时都引导零。例如,这看起来像

1900年1月1日下午1时

你可能想使用的格式

DateTime.ParseExact(date, "MMM d yyyy h:mmtt", CultureInfo.InvariantCulture) 

不需要当天的前导零和小时位置。这将1900年1月1日1:00 PM

我希望这有助于匹配等值

+0

Jan 01 1900 12:00 AM尝试此格式仍不起作用。你的回答对我来说似乎是正确的。 – pcoonan

+0

@pcoonan它适合我。在你的文章中,你给出了两个示例字符串,第一个字符串有一个尾部空格。除了格式问题(可以使用本答案中给出的格式解决这些问题)之外,还需要删除需要删除的尾部空格,因为它们也会导致'FormatException'。可能使用['Trim()'](https://msdn.microsoft.com/en-us/library/t97s7bs3(v = vs.110).aspx)来摆脱所有前导和尾随空格。 – Quantic

+0

对不起,我感到困惑。我提供的格式不适合使用我提供的值。该值是您在问题中提供的格式所匹配的值的示例。我的格式应该适用于1900年1月1日1:00 AM这样的值,而不是您的原始格式,它与Jan 01 1900 01:00 AM相匹配。我提供的格式不需要前导零。你的确如此。这是唯一的区别。 –

0

第一个字符串将被成功解析。

第二个字符串需要使用d specifier而不是dd specifier,因为单日号码不是的前导零。

DateTime.ParseExact("Jun 29 2016 12:57PM", 
        "MMM dd yyyy hh:mmtt", 
        CultureInfo.InvariantCulture).Dump(); 

DateTime.ParseExact("Jan 1 1900 12:00AM ", 
        "MMM d yyyy hh:mmtt", 
        CultureInfo.InvariantCulture).Dump(); 

顺便说一句,你可以使用MMM d yyyy hh:mmtt格式对他们俩的。

+0

您可以在两个字符串上使用'd'。 – Quantic

+0

@Quantic是的,但可能不需要,因为'h'和'hh'都成功地分配了'12'。 –

+0

@Downvoter至少关心评论,所以我可以看到我可能会错在哪里? –

-1

这里的日期格式的备忘单,的http://www.mikesdotnetting.com/article/23/date-formatting-in-c

Example Usage 

<%= String.Format("{specifier}", DateTime.Now) %> 
@DateTime.Now.ToString("F") 
@DateTime.Now.ToString("hh:mm:ss.fff") 


Specifier 

Description 

Output 

d Short Date 08/04/2007 
D Long Date 08 April 2007 
t Short Time 21:08 
T Long Time 21:08:59 
f Full date and time 08 April 2007 21:08 
F Full date and time (long) 08 April 2007 21:08:59 
g Default date and time 08/04/2007 21:08 
G Default date and time (long) 08/04/2007 21:08:59 
M Day/Month 08 April 
r RFC1123 date Sun, 08 Apr 2007 21:08:59 GMT 
s Sortable date/time 2007-04-08T21:08:59 
u Universal time, local timezone 2007-04-08 21:08:59Z 
Y Month/Year April 2007 
dd Day 08 
ddd Short Day Name Sun 
dddd Full Day Name Sunday 
hh 2 digit hour 09 
HH 2 digit hour (24 hour) 21 
mm 2 digit minute 08 
MM Month 04 
MMM Short Month name Apr 
MMMM Month name April 
ss seconds 59 
fff milliseconds 120 
FFF milliseconds without trailing zero 12 
tt AM/PM PM 
yy 2 digit year 07 
yyyy 4 digit year 2007 
: Hours, minutes, seconds separator, e.g. {0:hh:mm:ss} 09:08:59 
/Year, month , day separator, e.g. {0:dd/MM/yyyy} 08/04/2007 
. milliseconds separator 
+2

这是什么? o.O我们真的需要这个吗? –

1

礼貌有其需要的格式,试图数组,并允许您指定空格是允许的DateTime.ParseExact过载:

string[] ss = new string[] { "Jun 29 2016 6:59PM", "Jan 1 1900 12:00AM " }; 
string[] formats = new string[] { "MMM dd yyyy h:mmtt", "MMM d yyyy hh:mmtt", "MMM dd yyyy hh:mmtt", "MMM d yyyy h:mmtt" }; 

foreach (string s in ss) 
{ 
    Console.WriteLine(DateTime.ParseExact(s, formats, null, DateTimeStyles.AllowWhiteSpaces).ToString("yyyy-MM-dd HH:mm:ss")); 
} 

但是如果您的日期字符串有点疏忽,您可以使用TryParse代替:

DateTime d; 
foreach (string s in ss) 
{ 
    if (DateTime.TryParse(s, out d)) 
    { 
     Console.WriteLine(d.ToString("yyyy-MM-dd HH:mm:ss")); 
    } 
} 

您应该指定一个System.IFormatProvider。

相关问题