使用G / g标准模式或LocalDateTime值

时间:2014-04-10 20:13:33

标签: c# parsing datetime nodatime

我尝试使用Noda Time LocalDateTimePattern.Parse()方法解析LocalDateTime值。我在美国。以下对Parse()的调用失败:

var localDateTimePattern = LocalDateTimePattern.Create("G", CultureInfo.InvariantCulture);
var parseResult = localDateTimePattern.Parse("4/10/2014 3:03:11 PM");

这也失败了

var localDateTimePattern = LocalDateTimePattern.Create("g", CultureInfo.InvariantCulture);
var parseResult = localDateTimePattern.Parse("4/10/2014 3:03:11 PM");

我做错了什么?我的想法是能够将标准中显示的DateTime字符串解析为当前的文化格式。

使用BCL,如下所示:

DateTime dateTime;
var parseResult = DateTime.Parse("4/10/2014 3:03:11 PM");

(此处询问了相关的格式问题:http://goo.gl/Q8DYTB

1 个答案:

答案 0 :(得分:3)

一些事情:

  • null传递给IFormatProviderCultureInfo参数,将使用当前文化,而不是不变文化。它相当于传递CultureInfo.CurrentCulture

  • 对于具有省略格式提供程序的重载的DateTime.ParseToString等方法,假设null - 再次映射到当前文化,不不变的文化

  • 在不变文化中,"G"格式为MM/dd/yyyy HH:mm:ss。您必须在所有字段中传递两位数(必要时使用前导零)(当然除了年份,当然是4),并且必须以24小时格式传递时间。不允许使用AM / PM指标。

  • 如果您希望将"G"与当前文化一起使用,请通过CultureInfo.CurrentCulture,或者如果您了解所需的文化,则通过该特定文化。

  • "g"格式与"G"相同,但不包含秒数。

  • Noda Time与上述所有常规类型相同,之外,它不允许传递null。我认为这是故意的,以避免这种混淆。

所以,你的方法失败了,因为你只传递了一个月的一位数,并且传递了12小时的时间格式,但是不变文化并不允许这样做。请尝试改为:

var pattern = LocalDateTimePattern.Create("G", CultureInfo.InvariantCulture);
var parseResult = pattern.Parse("04/10/2014 15:03:11");

或者也许:

var pattern = LocalDateTimePattern.Create("G", CultureInfo.CurrentCulture);
var parseResult = pattern.Parse("4/10/2014 3:03:11 PM");

或者,如果您当前的文化不是那种格式,那么使用特定的文化:

var culture = CultureInfo.CreateSpecificCulture("en-US");
var pattern = LocalDateTimePattern.Create("G", culture);
var parseResult = pattern.Parse("4/10/2014 3:03:11 PM");