【问题标题】:Parsing custom date formats (c#)解析自定义日期格式 (c#)
【发布时间】:2011-06-22 19:07:23
【问题描述】:

我正在使用的 api 为我提供了一个日期。该日期的类型为string,格式为:

Mon Nov 16 19:15:09 +0000 2009

DateTime.TryParse() 在提供此值时失败。谁能指出我正确的方向?

【问题讨论】:

标签: c# parsing datetime


【解决方案1】:

使用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,如果偏移量是+06:00)。

如果您需要将其转换为您自己的当地时间,这会很有趣 - 因为这将取决于 2009 年那个时候的 DST 规则 - 这可能会引起真正的头痛!

所以,如果您要去DateTime,我建议您转换为世界时,然后从那里开始。将此添加到测试中:

Console.WriteLine(result);
//little bit long winded - but you need the 'Universal' Kind for reliability
Console.WriteLine(
  DateTime.SpecifyKind(
    new DateTime(result.ToUniversalTime().Ticks), 
    DateTimeKind.Utc)
);    

这个输出:

2009 年 11 月 16 日 19:15:09 +06:00

2009 年 11 月 16 日 13:15:09

【讨论】:

  • 很好,没想到你可以反过来做 DateTime 格式。
  • @Ingó:的确,之前的项目已经在我的脑海中铭刻了这种细枝末节的痛苦。日期和时间会造成太多麻烦!
  • 请注意,有一个名为 NodaTime 的不错的库可以明确时区的复杂性(因此更容易正确):nodatime.org
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      你的几乎是这样的:ddd, MMM dd yyyy HH':'mm':'ss zzz yyyy

      唯一的问题是时区偏移,zzz 在小时和分钟之间包含一个冒号。虽然 zz'00' 是作弊,但您可能会侥幸逃脱。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        相关资源
        最近更新 更多