我尝试使用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)
答案 0 :(得分:3)
一些事情:
将null
传递给IFormatProvider
或CultureInfo
参数,将使用当前文化,而不是不变文化。它相当于传递CultureInfo.CurrentCulture
。
对于具有省略格式提供程序的重载的DateTime.Parse
或ToString
等方法,假设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");