Как я могу форматировать DateTime в формат web UTC?
У меня есть дата-время, которое я хочу отформатировать в "2009-09-01T00:00:00.000Z
", но следующий код дает мне "2009-09-01T00:00:00.000+01:00
" (обе линии):
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
new DateTime(2009, 9, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz")
любые идеи как заставить его работать?
8 ответов:
почему бы просто не использовать спецификатор формата туда и обратно ("O", "o")?
спецификатор стандартного формата "O" или "o" представляет пользовательскую строку формата даты и времени с использованием шаблона, который сохраняет информацию о часовом поясе и выдает строку результата, соответствующую стандарту ISO 8601. Для значений DateTime этот спецификатор формата предназначен для сохранения значений даты и времени вместе с DateTime.Вид свойства в тексте. Форматированная строка может быть проанализирован с помощью значение datetime.Синтаксический анализ (String, IFormatProvider, DateTimeStyles) или DateTime.Метод ParseExact, если параметр styles имеет значение DateTimeStyles.Круговая порука.
спецификатор стандартного формата" O "или" o "соответствует " yyyy'-'MM'-'dd'T'h':'mm':'ss'.'fffffffK" строка пользовательского формата для значений DateTime и для "yyyy" -'MM' - 'dd'T'h':'mm':'ss'.'fffffffzzz" строка пользовательского формата для значений DateTimeOffset. В этой строке пары одинарных кавычек, которые разделяют отдельные символы, такие как дефисы, двоеточия и буква "Т", указывают на то, что отдельный символ является литералом, который нельзя изменить. Апострофы не отображаются в выходной строке.
спецификатор стандартного формата O" или "o" (и "yyyy'-'MM'-'dd'T'h':'mm':'ss'.'fffffffk" custom format string) использует три способа, которыми ISO 8601 представляет информацию о часовом поясе, чтобы сохранить свойство Kind значений DateTime:
public class Example { public static void Main() { DateTime dat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Unspecified); Console.WriteLine("{0} ({1}) --> {0:O}", dat, dat.Kind); DateTime uDat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Utc); Console.WriteLine("{0} ({1}) --> {0:O}", uDat, uDat.Kind); DateTime lDat = new DateTime(2009, 6, 15, 13, 45, 30, DateTimeKind.Local); Console.WriteLine("{0} ({1}) --> {0:O}\n", lDat, lDat.Kind); DateTimeOffset dto = new DateTimeOffset(lDat); Console.WriteLine("{0} --> {0:O}", dto); } } // The example displays the following output: // 6/15/2009 1:45:30 PM (Unspecified) --> 2009-06-15T13:45:30.0000000 // 6/15/2009 1:45:30 PM (Utc) --> 2009-06-15T13:45:30.0000000Z // 6/15/2009 1:45:30 PM (Local) --> 2009-06-15T13:45:30.0000000-07:00 // // 6/15/2009 1:45:30 PM -07:00 --> 2009-06-15T13:45:30.0000000-07:00
лучший формат для использования- "гггг" - " мм " - "dd'T'HH": "мм": "ss".'fffK".
последняя строка K on будет изменена на' Z', если дата UTC или с часовым поясом (+-hh:mm), если локальна. (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx)
Как сказал Лукэ, хорошо использовать ToUniversalTime, если вы хотите, чтобы все даты были UTC.
окончательный код:
string foo = yourDateTime.ToUniversalTime() .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
вы хотите использовать DateTimeOffset класса.
var date = new DateTimeOffset(2009, 9, 1, 0, 0, 0, 0, new TimeSpan(0L)); var stringDate = date.ToString("u");
извините, я пропустил ваше оригинальное форматирование с милисекундами
var stringDate = date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
возвращает 2017-02-10T08:12: 39.483 Z
некоторые люди указали, что "ToUniversalTime" несколько небезопасен в том, что он может вызвать непреднамеренные неправильные отображения времени. Расширяя это, я предоставляю более подробный пример решения. Пример здесь создает расширение для объекта DateTime, которое безопасно возвращает UTC DateTime, где вы можете использовать ToString по желанию....
class Program { static void Main(string[] args) { DateTime dUtc = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Utc); DateTime dUnspecified = new DateTime(2016, 6, 1, 3, 17, 0, 0, DateTimeKind.Unspecified); //Sample of an unintended mangle: //Prints "2016-06-01 10:17:00Z" Console.WriteLine(dUnspecified.ToUniversalTime().ToString("u")); //Prints "2016 - 06 - 01 03:17:00Z" Console.WriteLine(dUtc.SafeUniversal().ToString("u")); //Prints "2016 - 06 - 01 03:17:00Z" Console.WriteLine(dUnspecified.SafeUniversal().ToString("u")); } } public static class ConvertExtensions { public static DateTime SafeUniversal(this DateTime inTime) { return (DateTimeKind.Unspecified == inTime.Kind) ? new DateTime(inTime.Ticks, DateTimeKind.Utc) : inTime.ToUniversalTime(); } }
этот код работает для меня:
var datetime = new DateTime(2017, 10, 27, 14, 45, 53, 175, DateTimeKind.Local); var text = datetime.ToString("o"); Console.WriteLine(text); -- 2017-10-27T14:45:53.1750000+03:00 // datetime from string var newDate = DateTime.ParseExact(text, "o", null);