4

我目前正在使用 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

4

2 回答 2

5

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

return result.Value.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture);
于 2014-03-14T18:02:39.067 回答
3

正如 ANeves 所提到的,您可以使用 BCL 样式格式化 using ToString(pattern, IFormatProvider),但还值得注意的是,所有模式对象都已经支持Format(value)除 之外的方法Parse(string),因此您还可以编写:

var displayPattern = OffsetDateTimePattern.Create("MM/dd/yyyy' 'HH:mm", CultureInfo.InvariantCulture, defaultValue);
return displayPattern.Format(result.Value);

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

Noda Time 用户指南有一个关于文本处理的部分更详细地介绍了这一点。

与您的问题没有直接关系,但是:如果您在OffsetDateTime不包括偏移量的情况下格式化显示,您通常希望将其转换为LocalDateTime(可能具有固定偏移时区)以确保结果具有可比性。就目前而言,您将为 of2014-03-11T02:00:00-07:00和 eg的输入返回相同的字符串2014-03-11T02:00:00-08:00。也许这对您的用例没问题。

于 2014-03-17T10:29:40.077 回答