使用NodaTime解析输入并输出不同的dateTime格式

时间:2014-03-14 15:50:17

标签: c# datetime nodatime

我目前正在使用NodaTime来解析日期和输出日期

public static string nodaTimeTest6(string input)
{
    var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero);
    var pattern = OffsetDateTimePattern.Create("yyyy-MM-dd'T'HH:mm:sso<m>", CultureInfo.InvariantCulture, defaultValue);
    var result = pattern.Parse(input);

    return result.Value.Month + "/" + result.Value.Day + "/" + result.Value.Year + " " + result.Value.ClockHourOfHalfDay;
}

例如,输入是:2014-03-11T02:00:00-07:00

如果我的return语句如下:return result.Value.ToString(),那么输出将如下所示:2014-03-11T02:00:00-07

我理解使用NodaTime属性(这是一个救生员),但是,我对这样的输出感兴趣:

yyyy-MM-dd HH:mm:ss

yyyyMMdd HH:mm:ss

dd/MM/yyyy hh:mm

所以我尝试将return语句更改为:

return result.Value.Month + "/" + result.Value.Day + "/" + result.Value.Year + " " + result.Value.Hour + ":" + result.Value.Minute;

该格式的最终​​输出是:3/11/2014 2:0

无论如何都要制作输出,因此它是一种固定格式,如03/11/2014 02:00

我知道如果我输入01作为我的月份,则输出为1/11/2014而不是01/11/2014

2 个答案:

答案 0 :(得分:5)

您可以将格式发送到ToString方法:

return result.Value.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture);

答案 1 :(得分:2)

正如ANeves所提到的,您可以使用ToString(pattern, IFormatProvider)使用BCL样式格式,但值得注意的是,除了{{1}之外,所有模式对象都已支持Format(value)方法所以你也可以写:

Parse(string)

这可能与使用模式进行解析更加一致,如果您可以保持模式并多次使用它,也可能更有效。

Noda Time用户指南的Text handling部分详细介绍了此内容。

与您的问题没有直接关系,但是:如果您在不包含偏移量的情况下格式化var displayPattern = OffsetDateTimePattern.Create("MM/dd/yyyy' 'HH:mm", CultureInfo.InvariantCulture, defaultValue); return displayPattern.Format(result.Value); 进行显示,则通常需要将其转换为OffsetDateTime(可能具有固定偏移时区)以确保结果具有可比性。就目前而言,您将为LocalDateTime的输入返回相同的字符串,例如2014-03-11T02:00:00-07:00。也许这对你的用例没问题。