1

我正在尝试使用 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

4

1 回答 1

3

一些东西:

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

  • 对于类似DateTime.ParseorToString的具有忽略格式提供程序的重载的方法,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");
于 2014-04-10T23:55:24.963 回答