我目前正在使用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
答案 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
。也许这对你的用例没问题。