формат даты гггг-мм-ддTHH: мм: ссZ


103

Я предполагаю, что это должно быть довольно просто, но я не мог этого понять :(. В этом формате Z - часовой пояс.
T - шаблон длительного времени.
Как я могу получить дату в этом формате, кроме как с помощью

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

в C #


1
Я знаю, что этот вопрос существует уже 9 лет, но принятый ответ UtcNow.ToString(s)+Zневерен. ISO8601 поддерживается опцией RoundTripToString("O") . Также отметим, что в принятом ответе используется значение даты и времени в формате UTC, которое всегда будет указывать часовой пояс Z, а не просто использовать фактическое значение даты и времени, которое (если Kind = Local) может содержать часовой пояс для перехода на летнее время. Рассмотрите возможность изменения принятого ответа?
— Ричардиссимо

Ответы:


144

Использование UTC

ISO 8601 ( форматы даты и времени MSDN )

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

2009-11-13T10: 39: 35Z

Z есть , потому что

Если время указано в формате 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);

Обратите внимание на две вещи: + или - требуется по истечении времени, но, очевидно, + не отображается на положительных числах. Согласно wikipedia смещение может быть в формате + hh или + hh: mm. Я сохранил всего несколько часов.

Насколько мне известно, RFC1123 (дата HTTP, форматер "u") не предназначен для смещения часовых поясов. Все время указано по Гринвичу / UTC.


Прохладно. Однако ваш вывод не включает смещение TZ?
— Нил Барнуэлл,

Я добавил его - в документах говорится, что формат s основан на ISO8601, я не думаю, что он включает часовой пояс.
— Chris S

Конечно, в UTC нет часовых поясов. Ооо. Он запрашивает информацию о часовом поясе в своем выводе. Может быть, DateTimeOffset - это то, что он ищет?
— Нил Барнуэлл,

5
Добавлять Z вручную нецелесообразно, вы должны использовать .ToString ("o"), потому что это даст вам правильный результат. Если миллисекунды являются проблемой, их следует округлить. Добавление Z вручную может дать неверный результат, если вы добавите его к местному времени, которое на самом деле не является UTC.
— Туукка Линдроос

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» и добавить Z в конце для дат в формате UTC. Это все хорошо, если вам не нужны миллисекунды, но если вам нужны миллисекунды, вы должны использовать «o», как показано в этом ответе. С «o» миллисекунды отображаются по умолчанию, а Z уже добавлен в конце для дат UTC.
— Джим

1
DateTime.Now.ToString ("o") Решает все виды проблем, поскольку возвращает с ним правильное смещение.
— Мо Заатар

12

Формат «o» отличается для DateTime и DateTimeOffset :(

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"

Вы сэкономили мне много времени. Простое и приятное решение.
— Раджу Паладия

6

Посмотрите здесь на шаблоны «u» и «s». Первый без разделителя «Т», а второй без суффикса часового пояса.



5

Одним из вариантов может быть преобразование DateTime в ToUniversalTime () перед преобразованием в строку с использованием формата «o» . Например,

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

Он выведет:

2016-01-31T20:16:01.9092348Z

2

Он отлично работает с форматами datetime запросов 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.