У меня есть DateTime, который я хочу отформатировать в " 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")
Есть идеи, как заставить его работать?
.ToUniversalTime()
все, что хотите, это не изменит его. - Однако, если у вас есть значение всемирного времени, сохраненное как местное время, тогда оно, конечно, изменит его (но в этом случае у вас есть более серьезные проблемы, с которыми нужно иметь дело!) - В любом случае, этот ответ ужасно."O"
Вместо этого следует использовать строку формата, указанную в ответе ниже.2009-09-01T00:00:00.000Z
. Использование «O» спецификатор даст им что - то другое:2009-09-01T00:00:00.0000000Z
.Почему бы просто не использовать описатель формата Round-trip ("O", "o") ?
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
источник
"yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffffffzzz"
это не формат Zulu.dtVariable.ToUniversalTime().ToString("o")
который будет преобразован в"2019-05-26T19:50:34.4400000Z"
или"yyyy-MM-ddTHH:mm:ss.fffffffZ"
. Примечание: я также протестировал это с помощьюnew Date(dtDateString).getTime()
метода Javscript, и он правильно анализирует строку даты, созданную этим.dto.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'FFFFFFF'Z'")
. Для записи просто"o"
добавляет смещение, это не формат Zulu.$"{DateTime.UtcNow:O}"
string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)
возвращает 2017-02-10T08: 12: 39.483Z
источник
Лучше всего использовать формат «гггг» - «ММ» - «дд'Т'ЧЧ»: «мм»: «сс». 'FffK ".
Последний K в строке будет изменен на 'Z', если дата является UTC, или с часовым поясом (+ -hh: mm), если она локальная. ( http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx )
Как сказал LukeH, хорошо использовать ToUniversalTime, если вы хотите, чтобы все даты были в формате UTC.
Окончательный код:
string foo = yourDateTime.ToUniversalTime() .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffK");
источник
Некоторые люди указали, что «ToUniversalTime» в некоторой степени небезопасно, поскольку может вызвать непреднамеренные неправильные дисплеи времени. В дополнение к этому я предлагаю более подробный пример решения. В приведенном здесь примере создается расширение для объекта DateTime, которое безопасно возвращает DateTime в формате UTC, где вы можете использовать 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(); } }
источник
Вы хотите использовать класс 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'");
источник
Этот код работает для меня:
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);
источник
Попробуй это:
DateTime date = DateTime.ParseExact( "Tue, 1 Jan 2008 00:00:00 UTC", "ddd, d MMM yyyy HH:mm:ss UTC", CultureInfo.InvariantCulture);
Ранее заданный вопрос
источник