代码之家  ›  专栏  ›  技术社区  ›  Lucas Jones

将堆栈溢出中的非标准日期字符串解析为.NET日期时间

  •  1
  • Lucas Jones  · 技术社区  · 15 年前

    我正在写一个屏幕刮刀来清除堆栈溢出。我现在写的这个位接受HTML并将所有信息放入一个模型对象中。我在分析答案中的信息时遇到了一些麻烦。

    问题是stackoverflow用来描述绝对时间的日期格式。 DateTime.Parse 不适用于它们。我试着跟他开玩笑 DateTime.ParseExact 但我没有成功。两抛一 FormatException

    以下是一些背景:

    如果您在源HTML中查找答案,您将得到:

    <div id="answer-{id}" class="answer">
        <!-- ... -->
                answered <span title="2009-06-18 13:21:16Z UTC" class="relativetime">Jun 18 at 13:21</span>
        <!-- ... -->
    </div>
    

    请注意,绝对时间存储在SPAN的标题属性中。我已经用过了 HTML Agility Pack 从codeplex中访问元素,并提取了属性的值。

    现在我想知道如何获得 "2009-06-18 13:21:16Z UTC" 进入.NET DateTime 对象。

    我希望能够做到这一点不需要正则表达式等,但由于整个项目是黑客和不稳定的,我真的不介意!

    最后,由于以下原因,我无法使用数据转储:

    1. 我不能用BitTorrent。曾经。
    2. 如果可以的话,这些文件对于我的网络连接来说太大了。
    3. 有点过时了。
    4. 没那么好玩!
    3 回复  |  直到 10 年前
        1
  •  4
  •   dtb    15 年前

    "Z" "UTC" 在同一 DateTime 字符串似乎是多余的。

    如果你移除 “UTC” 从字符串中, Parse 作品:

    System.DateTime.Parse("2009-06-18 13:21:16Z")
    {18.06.2009 15:21:16}
        Date: {18.06.2009 00:00:00}
        Day: 18
        DayOfWeek: Thursday
        DayOfYear: 169
        Hour: 15
        Kind: Local
        Millisecond: 0
        Minute: 21
        Month: 6
        Second: 16
        Ticks: 633809352760000000
        TimeOfDay: {15:21:16}
        Year: 2009
    
        2
  •  2
  •   Noon Silk    15 年前

    好吧,你永远不会用regex来做这个,但是我认为这个格式只是这里描述的“u”格式: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx

    所以parseexact应该接受这一点(通过一些小的工作)。

        3
  •  1
  •   nos    15 年前

    我在这里没有找到与时区(z-utc)匹配的魔力,但是假设它们都是utc,这应该可以让您开始:

       string d = "2009-06-18 13:21:16Z UTC";
       CultureInfo provider = CultureInfo.InvariantCulture;
       string format  = "yyyy-MM-dd HH:mm:ssZ UTC";
       DateTime dt ;
       if(DateTime.TryParseExact(d,format,provider,DateTimeStyles.AssumeUniversal,out dt) {
              //use dt;
       } else {
           //bail out, error.
       }