Parsing 以宽容的方式将DateTime字符串解析为Noda Time LocalDateTime?

Parsing 以宽容的方式将DateTime字符串解析为Noda Time LocalDateTime?,parsing,datetime,nodatime,Parsing,Datetime,Nodatime,我有一个GetDateTimeOffset(字符串纬度、字符串经度、字符串日期时间)web服务,它在给定Lat/Long和本地日期时间的情况下确定时间偏移量 我们当前的客户端网页使用DateTimePicker插件。我们使用默认的日期格式和时间部分格式为“h:mm:ss TT Z”,因此传递给服务器的字符串看起来像“01/22/2014 12:09:00 AM-05:00”。但我正在考虑使我们的web服务更通用,因此它应该可以原谅传入的日期时间字符串格式 现在,我正在使用BCL以次优方式解析Da

我有一个GetDateTimeOffset(字符串纬度、字符串经度、字符串日期时间)web服务,它在给定Lat/Long和本地日期时间的情况下确定时间偏移量

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

现在,我正在使用BCL以次优方式解析DateTime字符串(用户输入)

问题:

  • a) 上面的代码是否是一种以灵活的“宽容”方式将用户输入解析为DateTime的正确方法
  • b) 将dateTime字符串解析为LocalDateTime(Noda Time类)的好方法是什么
我想我应该用

  • 用于在Noda时间中获取系统的LocalDateTime
  • 解析(字符串)和Jon Skeet在这里描述的解析各种格式的方法。但是要使用哪些模式使其真正灵活

如果您需要解析该特定模式,则可以执行该操作
DateTimeOffset.TryParseExact
,或者使用要从该输入解析的节点时间代码:

var defaultValue=newoffsetdatetime(newlocaldatetime(2000,1,1,0,0),Offset.Zero);
var pattern=OffsetDateTimePattern.Create(“MM/dd/yyyy hh:MM:ss tt o”,CultureInfo.InvariantCulture,defaultValue);
var result=pattern.Parse(“01/22/2014 12:09:00 AM-05:00”);
如果(!result.Success)
{
//处理你的错误
}
OffsetDateTime值=结果值;
LocalDateTime local=value.LocalDateTime;
但回到你的陈述:

但我正在考虑使我们的web服务更通用,因此它应该可以原谅传入的日期时间字符串格式


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

Matt,如何将ISO-8601扩展格式指定为OffsetDateTimePattern.Create()的第一个参数?野田时间是否为该格式提供了一些文字常量?另外,我应该传递什么格式的字符串来解析“2014-01-22T12:09:00-05:00”字符串?o的含义是什么?您会发现
OffsetDateTimePattern.ExtendedIsoPattern
已经存在,尽管您可以使用常规模式(
G
)手动连接它
o
是一种偏移模式。具体来说,它是“中等格式标准模式”。“看吧,”绿卷心菜-好问题!请看我的回答。
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) { }
}