解析自定义日期格式(c#)

时间:2011-06-22 10:32:16

标签: c# parsing datetime

使用api即可为我提供约会。此日期的类型为string,格式为:

  

Mon Nov 16 19:15:09 +0000 2009

提供此值时,

DateTime.TryParse()失败。有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:8)

使用DateTimeOffset类来处理偏移量。

[TestMethod]
public void test()
{
  string s = "Mon Nov 16 19:15:09 +0000 2009";

  var result = DateTimeOffset.ParseExact(
    s, 
    "ddd MMM dd HH:mm:ss zzz yyyy", 
    System.Globalization.CultureInfo.InvariantCulture);

  Assert.AreEqual(16, result.Day);
  Assert.AreEqual(11, result.Month);
  Assert.AreEqual(2009, result.Year);
  Assert.AreEqual(19, result.Hour);
  Assert.AreEqual(15, result.Minute);
  Assert.AreEqual(9, result.Second);
  Assert.AreEqual(0, result.Offset.Hours);    
}

更改字符串中的偏移量 - 例如'0600'然后更改偏移断言以匹配,它将起作用。

如果必须,您可以将其转换为DateTime但是您丢失了偏移信息;所以你必须决定是否要将它保留为原始的本地时间(19:15:09),或者你是否要转换为某个标准时间(例如13:19:05 UTC如果偏移是{{ 1}})。

如果您需要将其转换为您当地的时间,那将非常有趣 - 因为它取决于2009年当年的DST规则 - 这可能会导致真正的头痛!

所以,如果你要+06:00,我建议转换为世界时,然后从那里开始。将其添加到测试中:

DateTime

输出:

  

11/16/2009 19:15:09 +06:00

     

11/16/2009 13:15:09

答案 1 :(得分:2)

尝试DateTime.TryParseExact传递合适的格式字符串。

答案 2 :(得分:0)

其中一个TryParse方法接受一个I​​FormatProvider,它也可以作为DateTimeFormatInfo类。以下链接包含所有必要的详细信息:

http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx

你的几乎就像:ddd,MMM dd yyyy HH':​​'mm':'ss zzz yyyy

唯一的问题是时区偏移,zzz包括小时和分钟之间的冒号。你可能会因为作弊而使用zz'00'而逃脱。

答案 3 :(得分:0)

因为DateTime.TryParse(String,DateTime)方法尝试使用当前区域性的格式化规则解析日期和时间的字符串表示形式,尝试解析跨不同文化的特定字符串可能会失败或返回不同的结果。如果将跨不同的语言环境解析特定的日期和时间格式,请使用DateTime.TryParse(String, IFormatProvider, DateTimeStyles, DateTime)方法或TryParseExact方法的重载之一,并提供格式说明符。