【问题标题】:Issue parsing NodaTime LocalDate from standard pattern从标准模式解析 NodaTime LocalDate 的问题
【发布时间】:2014-05-31 17:32:59
【问题描述】:

我在尝试将字符串解析为 NodaTime LocalDate 时遇到问题。我的代码如下所示:

var value = "Monday, May 26, 2014";
var pattern = LocalDatePattern.CreateWithInvariantCulture("d");
var parseResult = pattern.Parse(value);
var localDate = parseResult.GetValueOrThrow();

这总是会导致 UnparsableValueException:

附加信息:值字符串与格式字符串“MM”中所需的数字不匹配。

据我所知,我的值应该符合标准模式(当我查看模式的示例模板值时,它看起来与我尝试解析的值非常相似)。我在这里错过了什么?

编辑

我将代码更改为以下内容,但仍然收到类似错误:

var value = "Monday, May 26, 2014";
var pattern = LocalDatePattern.CreateWithInvariantCulture("dddd, dd MMMM, yyyy");
var parseResult = pattern.Parse(value);
var localDate = parseResult.GetValueOrThrow();

导致另一个 UnparsableValueException:

附加信息:值字符串与格式字符串“dd”中所需的数字不匹配。

【问题讨论】:

    标签: c# nodatime


    【解决方案1】:

    这里的主要问题是您使用的模式是“dd MMMM”(在这两种情况下),但您的输入是“MMMM dd”。 (对于“D”,您还有一个问题,即长日期模式在年份之前不包含逗号,您在输入中已包含该逗号。)

    下面解析了上面的输入,也演示了如何使用Format()来调试预期的输入:

    var pattern = LocalDatePattern.CreateWithInvariantCulture("dddd, MMMM dd, yyyy");
    Console.WriteLine("Expecting input {0}.", pattern.Format(new LocalDate(2014, 5, 26)));
    
    var value = "Monday, May 26, 2014";
    var parseResult = pattern.Parse(value);
    var localDate = parseResult.GetValueOrThrow();
    Console.WriteLine("Parsed value is {0}.", localDate);
    

    【讨论】:

    • 顺便说一句,我认为我们可以更好地报告这里的问题,所以我提交了code.google.com/p/noda-time/issues/detail?id=288
    • 谢谢马尔科姆。我会注意到我遇到了这个问题,因为 LocalDate 的默认 ToString() 以这种格式输出日期 - 是否有意使内置长日期模式无法解析该日期? (就像你说的,它好像少了一个逗号。)
    • 不仅仅是缺少逗号:它还颠倒了月份和日期。 ToString() 被记录为使用 current 文化使用“标准”格式模式(实际上是“D”,将澄清),而您正在使用不变文化进行解析。
    【解决方案2】:

    看起来他们颠倒了他们的例子。短日期模式(用d 表示)是“MM/dd/yyyy”。您想要长日期模式,用D 表示。

    【讨论】:

    • 感谢您的回复 - 我更改了我使用的模式,但现在仍然遇到类似的错误。
    猜你喜欢
    • 2012-01-09
    • 2020-04-26
    • 2019-10-27
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多