【问题标题】:How can I parse this date? [closed]我怎样才能解析这个日期? [关闭]
【发布时间】:2013-07-16 10:38:54
【问题描述】:

我想我错过了文化信息? (我不知道它是什么)。 我从 json 得到这个日期:

<created_at>Tue Jul 16 07:56:04 +0000 2013</created_at>

但如果我尝试:

var CreatedAt = DateTime.ParseExact((string)x["created_at"], "yyyy-MM-dd", null)

我得到一个String was not recognized as a valid DateTime. 异常。我应该使用什么?

【问题讨论】:

  • 你试过什么?您必须能够使用examples given here 解决问题。如果冒号 (:) 的缺失对zzzz 格式造成混淆,请尝试creating your own DateTimeFormatInfo
  • 您的ParseExact 需要yyyy-MM-dd 格式的值。这甚至与您提供的格式略微不同,是吗?
  • 阅读文档并不好玩。 StackOverflow,sudo 让我正确的模式格式。
  • 拜托,拜托,拜托,意外停止编程。

标签: c# datetime


【解决方案1】:

尝试使用此模式来匹配日期:

ddd MMM dd HH:mm:ss zzz yyyy

var input = "Tue Jul 16 07:56:04 +0000 2013";
var pattern = "ddd MMM dd HH:mm:ss zzz yyyy"
var result = DateTime.ParseExact(input, pattern, CultureInfo.InvariantCulture);
Console.WriteLine(result.ToUniversalTime()); // 7/16/2013 7:56:04 AM

或者这个来匹配日期它周围的XML标签:

'<created_at>'ddd MMM dd HH:mm:ss zzz yyyy'</created_at>'

var input = "<created_at>Tue Jul 16 07:56:04 +0000 2013</created_at>";
var pattern = "'<created_at>'ddd MMM dd HH:mm:ss zzz yyyy'</created_at>'";
var result = DateTime.ParseExact(input, pattern, CultureInfo.InvariantCulture);
Console.WriteLine(result.ToUniversalTime()); // 7/16/2013 7:56:04 AM

进一步阅读

【讨论】:

  • 我收到了同样的信息!
  • 日期为 Mon Jul 15 16:06:09 +0000 2013 它不起作用! (具有相同的模式)
  • @markzzz 是的。自从我最初发布以来,我已经更新它使用HH(24 小时制)而不是hh(12 小时制)。
【解决方案2】:

你可以用这个:

DateTime.ParseExact((string)x["created_at"], "ddd MMM dd hh:mm:ss zzzz yyyy", CultureInfo.InvariantCulture);

注意:如果您的字符串与您提供的格式不完全匹配(参见 ParseExact).. 那么它将不起作用。

【讨论】:

  • +1 表示不变的文化
  • 这似乎很完美!但是如果我输入 null 而不是 CultureInfo.InvariantCulture 我会收到相同的错误消息...
  • @markzzz 很明显,您的机器运行的文化并不隐含地理解传入的格式。当您将null 传递给IFormatProvider 时,Parse 方法使用当前的文化格式这台机器,我在英国文化下运行,所以null 对我来说很好,如果你的格式是文化独立,那么你应该使用InvariantCulture
  • 反正有问题。我在那个日期收到这个错误:String was not recognized as a valid DateTime. - Mon Jul 15 16:06:09 +0000 2013
【解决方案3】:
DateTime.ParseExact("Tue Jul 16 07:56:04 +0000 2013", 
                    "ddd MMM dd HH:mm:ss zzzz yyyy", 
                    CultureInfo.InvariantCulture);

Demo

请注意,HH 是 24 小时格式,而不是 hh

【讨论】:

    【解决方案4】:

    那是因为ParseExact 表示您正在告诉方法您的日期是 准确 格式(显然不是)。

    有问题的日期似乎是一种非常具体的格式,您需要执行以下操作:

    DateTime.ParseExact((string)x["created_at"], "ddd MMM dd hh:mm:ss zzzz yyyy", null);
    

    根据您的 cmets,您的应用程序似乎在不理解提供的日期/时间格式的文化下运行 - 传递 null 将隐式使用当前文化(通常是机器的文化)。在这种情况下,您需要传递CultureInfo.InvariantCulture 而不是null,原因是可以独立于解析期间强制执行的任何本地规则/本地化来解析字符串,即

    DateTime.ParseExact((string)x["created_at"], "ddd MMM dd hh:mm:ss zzzz yyyy", CultureInfo.InvariantCulture); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多