Как я могу отформатировать DateTime в формате UTC?

c# .net datetime utc

168241 просмотра

8 ответа

У меня есть 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")

Есть идеи, как заставить это работать?

Автор: Grzenio Источник Размещён: 12.11.2019 09:03

Ответы (8)


138 плюса

Решение
string foo = yourDateTime.ToUniversalTime()
                         .ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'");
Автор: LukeH Размещён: 30.11.2009 04:45

66 плюса

Почему бы просто не использовать спецификатор формата Round-trip ("O", "o") ?

Спецификатор стандартного формата «O» или «o» представляет пользовательскую строку формата даты и времени с использованием шаблона, который сохраняет информацию о часовом поясе и генерирует строку результата, соответствующую стандарту ISO 8601. Для значений DateTime этот спецификатор формата предназначен для сохранения даты и значения времени вместе со свойством DateTime.Kind в тексте. Отформатированную строку можно проанализировать с помощью метода DateTime.Parse (String, IFormatProvider, DateTimeStyles) или DateTime.ParseExact, если для параметра styles установлено значение DateTimeStyles.RoundtripKind.

Спецификатор стандартного формата «O» или «o» соответствует строке пользовательского формата «yyyy» - «MM» - «dd'T'HH»: «mm»: «ss». «FffffffK» для значений DateTime и "yyyy '-' MM '-' dd'T'HH ':' mm ':' ss '.' fffffffzzz" строка пользовательского формата для значений DateTimeOffset. В этой строке пары одинарных кавычек, которые разделяют отдельные символы, такие как дефисы, двоеточия и буква «Т», указывают, что отдельный символ является литералом, который не может быть изменен. Апострофы не отображаются в выходной строке.

Спецификатор стандартного формата O "или" o "(и строка пользовательского формата" yyyy "- 'MM' - 'dd'T'HH': 'mm': 'ss'. 'FffffffK") использует три способа: что 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
Автор: Dmitry Pavlov Размещён: 16.09.2014 05:26

8 плюса

string.Format("{0:yyyy-MM-ddTHH:mm:ss.FFFZ}", DateTime.UtcNow)

возвращается 2017-02-10T08: 12: 39.483Z

Автор: arviman Размещён: 10.02.2017 08:13

6 плюса

Лучший формат для использования - «гггг» - «ММ» - «дд'Т'ХХ»: «мм»: «сс». «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");
Автор: Carlos Beppler Размещён: 23.05.2013 04:12

6 плюса

Некоторые люди отмечают, что «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();
    }
}
Автор: user3228938 Размещён: 01.12.2016 07:07

4 плюса

Вы хотите использовать класс 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'");
Автор: Nick Berardi Размещён: 30.11.2009 04:45

3 плюса

Этот код работает для меня:

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);
Автор: Ergin Çelik Размещён: 27.10.2017 12:50

-2 плюса

Попробуй это:

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture);

Ранее заданный вопрос

Автор: Ian P Размещён: 30.11.2009 04:41
32x32