формат дати рррр-MM-ddTHH: мм: ссЗ


102

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

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

в C #


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

Відповіді:


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") не повинен давати зрушення в часовому поясі. Часовий час призначений для GMT / UTC.


Класно. Однак, ваш вихід не включає зміщення TZ?
Ніл Барнвелл

Я додав це в - документи говорять, що формат 's заснований на ISO8601. Я не думаю, що він включає часовий пояс.
Chris S

Ну звичайно, у UTC немає часових поясів. D'oh. Він запитує інформацію про часовий пояс у своєму висновку. Можливо, DateTimeOffset - це те, що він шукає?
Ніл Барнвелл

5
Додавання Z туди вручну - це не добре, слід використовувати .ToString ("o"), оскільки це дасть вам належний вихід. Якщо мілісекунди проблемні, їх слід округлити. Додавання Z вручну може дати неправильний результат, якщо додати його до місцевого часу, який насправді не є UTC.
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" і додавання Z в кінці для дати UTC. Це все добре і добре, якщо вам не потрібні мілісекунди, але якщо ви хочете мілісекунди, ви повинні використовувати "o", як показує ця відповідь. Якщо "o", за замовчуванням відображаються мілісекунди, а Z в кінці вже додається для дати UTC.
Джим

1
DateTime.Now.ToString ("o") Вирішує всі види проблем, тому що повертає правильне зміщення за допомогою нього.
Пн Заатар

12

Формат "o" відрізняється для DateTime vs 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". Перший - без розділювача "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;

ect.

нарешті:

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

Це дуже сміливий спосіб поводження з ним, хоча ...


Ця відповідь не дає нічого подібного до бажаного результату
cja

Це не забезпечило того, що питання, або я хотів ... -1
Ziggler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.