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

max*_*axp 0 c# datetime parsing

使用api即可为我提供约会.此日期属于类型,string并以以下格式显示:

Mon Nov 16 19:15:09 +0000 2009

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

And*_*tan 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);    
}
Run Code Online (Sandbox Code Playgroud)

更改字符串中的偏移量 - 例如"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)
);    
Run Code Online (Sandbox Code Playgroud)

这输出:

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

11/16/2009 13:15:09