【问题标题】:Parse DateTime string into Noda Time LocalDateTime in a forgiving way?以宽容的方式将 DateTime 字符串解析为 Noda Time LocalDateTime?
【发布时间】:2014-02-13 04:33:57
【问题描述】:

我有 GetDateTimeOffset(string latitude, string longitude, string dateTime) Web 服务,它确定给定 Lat/Long 和本地 DateTime 的时间偏移。

我们当前的客户端网页使用 DateTimePicker 插件http://trentrichardson.com/examples/timepicker/。我们使用默认的日期格式和格式时间部分作为“h:mm:ss TT Z”,因此我们传递给服务器的字符串看起来像“01/22/2014 12:09:00 AM -05:00”。但我正在考虑让我们的 Web 服务更通用,所以它应该允许传入的 dateTime 字符串格式。

现在我正在使用 BCL http://goo.gl/s9Kypx 以次优方式解析 DateTime 字符串(用户输入)。

var tmpDateTime = new DateTimeOffset(DateTime.Now).DateTime;
if (!String.IsNullOrEmpty(dateTime))
{
    try
    {
        // Note: Looks stupid? I need to throw away TimeZone Offset specified in dateTime string (if any).
        // Funny thing is that calling DateTime.Parse(dateTime) would automatically modify DateTime for its value in a system timezone.
        tmpDateTime = DateTimeOffset.Parse(dateTime).DateTime;
    }

    catch (Exception) { }
}

问题:

  • a) 上述代码是否是以灵活的“宽恕”方式将用户输入解析为 DateTime 的正确 BCL 方法?
  • b) 将 dateTime 字符串解析为 LocalDateTime(Noda Time 类)的好方法是什么?

我想我应该使用

  • http://goo.gl/a2wYco 获取系统在野田时间的 LocalDateTime
  • Lo​​calDateTimePattern.Parse(String) 并且可能是 Jon Skeet 在http://goo.gl/F8k51c 描述的方法,用于解析各种格式。但是要使用哪些模式才能使其真正灵活?

【问题讨论】:

    标签: parsing datetime nodatime


    【解决方案1】:

    如果您需要解析该特定模式,那么您可以这样做DateTimeOffset.TryParseExact,或者使用 NodaTime 代码从该输入中解析:

    var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero);
    var pattern = OffsetDateTimePattern.Create("MM/dd/yyyy hh:mm:ss tt o<m>", CultureInfo.InvariantCulture, defaultValue);
    var result = pattern.Parse("01/22/2014 12:09:00 AM -05:00");
    if (!result.Success)
    {
        // handle your error
    }
    
    OffsetDateTime value = result.Value;
    LocalDateTime local = value.LocalDateTime;
    

    但回到你的陈述:

    但我正在考虑让我们的 Web 服务更通用,因此它应该允许传入的 dateTime 字符串格式。

    这不是一个好主意。如果您正在创建一个网络服务,您应该非常明确地说明您使用的格式。最好不要使用您在此处显示的这种格式,而应使用 ISO-8601 扩展格式,例如 2014-01-22T12:09:00-05:00

    【讨论】:

    • Matt,如何指定 ISO-8601 扩展格式作为 OffsetDateTimePattern.Create() 的第一个参数? Noda Time 是否为该格式提供了一些文字常量?否则,我应该传递什么格式的字符串来解析“2014-01-22T12:09:00-05:00”字符串?
    • o是什么意思?
    • 您会发现 OffsetDateTimePattern.ExtendedIsoPattern 已经存在,不过您可以使用通用模式 (G) 手动连接它
    • o&lt;m&gt; 是一种偏移模式。具体来说,它是“中格式标准模式”。见OffsetDateTime PatternsOffset Patterns
    • @theGreenCabbage - 好问题!请参阅我的回复in your other post
    猜你喜欢
    • 2023-04-09
    • 2011-11-26
    • 2020-09-27
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2020-02-27
    相关资源
    最近更新 更多