日期格式yyyy-MM-ddTHH:mm:ssZ


102

我认为这应该很简单,但无法获得:(.。Z是时区
。T是长时间模式。
如何通过这种格式获取日期,除非使用

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:ssZ"));

在C#中


我知道这个问题已经存在了9年,但是公认的答案UtcNow.ToString(s)+Z是错误的。RoundTrip选项支持ISO8601 ToString("O")。还要指出的是,接受的答案使用的是日期时间的UTC值,它将始终给出时区Z,而不是仅使用实际的日期时间值(如果Kind = Local)可能包含夏时制时区。考虑更改接受的答案?
查迪西莫(Richardissimo)'18年

Answers:


144

使用UTC

ISO 8601MSDN日期时间格式

Console.WriteLine(DateTime.UtcNow.ToString("s") + "Z");

2009-11-13T10:39:35Z

ž是因为存在

如果时间以世界标准时间(UTC)为准,请在时间之后直接添加“ Z”,且不带空格。“ Z”是UTC偏移为零的区域标记。因此,“ 09:30 UTC”表示为“ 09:30Z”或“ 0930Z”。“ 14:45:15 UTC”将是“ 14:45:15Z”或“ 144515Z”。

如果要包括偏移量

int hours = TimeZoneInfo.Local.BaseUtcOffset.Hours;
string offset = string.Format("{0}{1}",((hours >0)? "+" :""),hours.ToString("00"));
string isoformat = DateTime.Now.ToString("s") + offset;
Console.WriteLine(isoformat);

需要注意的两件事:时间之后需要+或-,但显然+不会显示正数。根据维基百科,偏移量可以采用+ hh格式或+ hh:mm。我只呆了几个小时。

据我所知,RFC1123(HTTP日期,“ u”格式器)并不是要提供时区偏移量。所有时间均应为GMT / UTC。


凉。但是,您的输出不包含TZ偏移量?
尼尔·巴恩韦尔

我在其中添加了-文档说's'格式基于 ISO8601,我认为它不包含时区。
克里斯S

哦,当然,UTC没有时区。天啊 他正在输出中要求提供时区信息。也许DateTimeOffset是他正在寻找的东西?
尼尔·巴恩韦尔

5
手动在其中添加Z不好,您应该使用.ToString(“ o”),因为它将为您提供正确的输出。如果毫秒是问题,则应将其取整。如果将Z添加到本地时间(不是真正的UTC),则手动添加Z可能会导致错误的结果。
Tuukka Lindroos

67
Console.WriteLine(DateTime.UtcNow.ToString("o"));  
Console.WriteLine(DateTime.Now.ToString("o"));

输出:

2012-07-09T19:22:09.1440844Z  
2012-07-09T12:22:09.1440844-07:00

我使用了Console.WriteLine(DateTime.Now.ToString(“ o”));。谢谢
Ziggler

5
接受的答案说要使用格式说明符“ s”,并在UTC日期的末尾附加一个Z。如果您不需要毫秒,那就很好,但是如果您想要毫秒,则必须使用“ o”,如答案所示。使用“ o”时,默认情况下会显示毫秒,并且UTC日期的末尾已经附加了Z。
2015年

1
DateTime.Now.ToString(“ o”)解决所有类型的问题,因为它返回正确的偏移量。
Mo Zaatar '17

12

DateTime与DateTimeOffset的“ o”格式不同:(

DateTime.UtcNow.ToString("o") -> "2016-03-09T03:30:25.1263499Z"

DateTimeOffset.UtcNow.ToString("o") -> "2016-03-09T03:30:46.7775027+00:00"

我的最终答案是

DateTimeOffset.UtcDateTime.ToString("o")   //for DateTimeOffset type
DateTime.UtcNow.ToString("o")              //for DateTime type

7

在C#6+中,您可以使用字符串插值并使其更简洁:

$"{DateTime.UtcNow:s}Z"

你节省了我很多时间。简单而甜蜜的解决方案。
Raju Paladiya

6

看看这里的“U”和“S”模式。第一个没有'T'分隔符,第二个没有时区后缀。



5

一种选择是将DateTime转换为ToUniversalTime(),然后再使用“ o”格式转换为字符串。例如,

var dt = DateTime.Now.ToUniversalTime();
Console.WriteLine(dt.ToString("o"));

它将输出:

2016-01-31T20:16:01.9092348Z

2

与Salesforce REST API查询日期时间格式配合使用时效果很好

DateTime now = DateTime.UtcNow;
string startDate = now.AddDays(-5).ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");   
string endDate = now.ToString("yyyy-MM-ddTHH\\:mm\\:ssZ");  
//REST service Query 
string salesforceUrl= https://csxx.salesforce.com//services/data/v33.0/sobjects/Account/updated/?start=" + startDate + "&end=" + endDate;

// https://csxx.salesforce.com/services/data/v33.0/sobjects/Account/updated/?start=2015-03-10T15:15:57Z&end=2015-03-15T15:15:57Z

它从Salesforce返回结果没有任何问题。


-6

您可以将其拆分,这将需要更多代码,但将按照您喜欢的方式工作:

DateTime year = DateTime.Now.Year;
DateTime month = DateTime.Now.Month;
DateTime day = DateTime.Now.Day;

等等。

最后:

Console.WriteLine(year+month+day+etc.);

不过,这是一种非常大胆的处理方式...


这个答案会产生什么样的期望输出
CJA

这没有提供问题或我想要的东西... -1
Ziggler 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.