解析日期时间字符串转换成野田佳彦时间LocalDateTime在一个宽容的方式吗?(Parse Da

2019-10-19 06:00发布

我有GetDateTimeOffset(字符串纬度,经度字符串,字符串DATETIME)的Web服务,它确定时间偏移给出的纬度/龙和当地日期时间。

我们目前的客户端网页使用的DateTimePicker插件http://trentrichardson.com/examples/timepicker/ 。 我们使用默认的日期格式和时间格式的一部分,“H:MM:SS TT Z”,所以我们传递给服务器的字符串看起来像'01 /二千○十四分之二十二上午12时09分00秒-05:00' 。 但我想使我们的网络服务更通用的,所以它应该是宽容所传递的时间字符串的格式。

现在,我在使用BCL一个次优的方式解析的时间字符串(用户输入) http://goo.gl/s9Kypx 。

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) { }
}

问题:

  • 一)是对上述代码解析用户输入到日期时间在柔性“宽容”的方式的适当方法BCL?
  • 二)什么是解析的时间字符串到LocalDateTime(野田Time类)的一个很好的和“宽容”的方式?

我想我应该用

  • http://goo.gl/a2wYco用于获取系统的LocalDateTime在Noda时间
  • LocalDateTimePattern.Parse(字符串),并可能是通过乔恩斯基特这里所描述的方法http://goo.gl/F8k51c用于解析各种格式的能力。 但是, 要使用的模式 ,使之真正灵活?

Answer 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服务 ,你应该是关于你正在使用的格式非常明确的。 优选的是,它不应该是这种格式,你在这里表现,而是应该是ISO-8601扩展格式,如2014-01-22T12:09:00-05:00



文章来源: Parse DateTime string into Noda Time LocalDateTime in a forgiving way?