Другое

Как преобразовать DateTime в строку формата ISO 8601 в C#

Узнайте, как преобразовывать объекты DateTime в строки формата ISO 8601 в C#. Полное руководство с примерами для DateTime видов UTC, локального и неопределенного.

Имея объект DateTime, как я могу преобразовать его в строку в формате ISO 8601?

Дано:

DateTime.UtcNow

Как получить строку, которая представляет то же значение в формате, соответствующем ISO 8601?

Обратите внимание, что ISO 8601 определяет несколько похожих форматов. Конкретный формат, который я ищу, это:

yyyy-MM-ddTHH:mm:ssZ

Чтобы преобразовать объект DateTime в строку отформатированного в соответствии со стандартом ISO 8601 формата yyyy-MM-ddTHH:mm:ssZ, можно использовать метод ToString() со строкой пользовательского формата. Для DateTime.UtcNow такое преобразование выполняется просто, поскольку он представляет время в формате UTC, а суффикс ‘Z’ обозначает UTC.


Содержание


Базовый метод преобразования

Простейший способ преобразования DateTime.UtcNow в желаемый формат ISO 8601:

csharp
string isoString = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");

Это создаст строку вида: 2023-05-11T14:30:45Z

Компоненты строки формата работают следующим образом:

  • yyyy - четырехзначный год
  • MM - двузначный месяц
  • dd - двузначный день
  • T - буквенный разделитель между датой и временем
  • HH - двузначный час (24-часовой формат)
  • mm - двузначные минуты
  • ss - двузначные секунды
  • Z - обозначение UTC

Примечание: Суффикс ‘Z’ указывает, что время находится в формате UTC, что точно соответствует тому, что представляет DateTime.UtcNow.


Работа с различными видами DateTime

При работе с объектами DateTime, которые не находятся в формате UTC, необходимо учитывать свойство DateTimeKind. Свойство DateTime.Kind может быть:

  • DateTimeKind.Utc
  • DateTimeKind.Local
  • DateTimeKind.Unspecified

Для разных видов требуются разные подходы:

Для DateTime в формате UTC

csharp
DateTime utcTime = DateTime.UtcNow;
string isoUtc = utcTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
// Вывод: 2023-05-11T14:30:45Z

Для DateTime в локальном формате

csharp
DateTime localTime = DateTime.Now;
// Сначала преобразуем в UTC, затем форматируем
string isoLocal = localTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
// Вывод: 2023-05-11T14:30:45Z (предполагая, что ваше локальное время - UTC+0)

Для DateTime с неопределенным форматом

csharp
DateTime unspecifiedTime = new DateTime(2023, 5, 11, 14, 30, 45, DateTimeKind.Unspecified);
// Рассматриваем как UTC или преобразуем соответствующим образом
string isoUnspecified = unspecifiedTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");

Альтернативные варианты форматирования

Использование спецификатора формата ‘K’

Спецификатор формата ‘K’ автоматически обрабатывает информацию о часовом поясе:

csharp
string isoWithK = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssK");
// Вывод: 2023-05-11T14:30:45Z

Спецификатор ‘K’:

  • Выводит ‘Z’ для времени в формате UTC
  • Выводит смещение, например ‘+05:00’, для локального времени
  • Не выводит информацию о часовом поясе для неопределенного времени

Использование стандартных форматов ‘O’ или ‘o’

Стандартные спецификаторы формата обеспечивают соответствие стандарту ISO 8601, но включают миллисекунды:

csharp
string isoWithO = DateTime.UtcNow.ToString("O");
// Вывод: 2023-05-11T14:30:45.1234567Z

string isoWitho = DateTime.UtcNow.ToString("o");
// Результат такой же, как выше

Важные замечания

Осведомленность о часовом поясе

При преобразовании локального времени всегда сначала преобразуйте в UTC для использования суффикса ‘Z’:

csharp
// Правильный подход
DateTime localTime = DateTime.Now;
string correctIso = localTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");

// Неправильный подход - это все равно будет использовать локальный часовой пояс
string incorrectIso = localTime.ToString("yyyy-MM-ddTHH:mm:ssZ");

Миллисекунды и точность

Запрошенный формат (yyyy-MM-ddTHH:mm:ssZ) не включает миллисекунды. Если требуется более высокая точность, рассмотрите:

csharp
// С миллисекундами
string withMilliseconds = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
// Вывод: 2023-05-11T14:30:45.123Z

// С полной точностью
string fullPrecision = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ");
// Вывод: 2023-05-11T14:30:45.1234567Z

Сериализация XML и JSON

Многие методы сериализации имеют встроенную поддержку ISO 8601:

csharp
// Сериализация XML
string xmlDate = XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.Utc);

// Сериализация JSON (с использованием System.Text.Json)

Полные примеры

Базовый метод преобразования

csharp
using System;

class Program
{
    static void Main()
    {
        // Получаем текущее время в формате UTC
        DateTime utcNow = DateTime.UtcNow;
        
        // Преобразуем в формат ISO 8601
        string isoString = utcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
        
        Console.WriteLine($"Время UTC: {utcNow}");
        Console.WriteLine($"ISO 8601: {isoString}");
        // Пример вывода:
        // Время UTC: 05/11/2023 14:30:45
        // ISO 8601: 2023-05-11T14:30:45Z
    }
}

Работа с различными часовыми поясами

csharp
using System;

class Program
{
    static void Main()
    {
        DateTime now = DateTime.Now;
        DateTime utcNow = DateTime.UtcNow;
        
        // Локальное время, преобразованное в формат UTC
        string localAsUtc = now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
        
        // Чистое время в формате UTC
        string pureUtc = utcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
        
        Console.WriteLine($"Локальное время: {now}");
        Console.WriteLine($"Локальное время как UTC: {localAsUtc}");
        Console.WriteLine($"Чистое UTC: {pureUtc}");
    }
}

Сравнение различных форматов ISO 8601

csharp
using System;

class Program
{
    static void Main()
    {
        DateTime now = DateTime.UtcNow;
        
        Console.WriteLine("Различные форматы ISO 8601:");
        Console.WriteLine($"yyyy-MM-ddTHH:mm:ssZ: {now.ToString("yyyy-MM-ddTHH:mm:ssZ")}");
        Console.WriteLine($"yyyy-MM-ddTHH:mm:ssK: {now.ToString("yyyy-MM-ddTHH:mm:ssK")}");
        Console.WriteLine($"Формат O: {now.ToString("O")}");
        Console.WriteLine($"Формат o: {now.ToString("o")}");
        Console.WriteLine($"yyyy-MM-ddTHH:mm:ss.fffZ: {now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")}");
    }
}

Заключение

  1. Для точного формата yyyy-MM-ddTHH:mm:ssZ используйте DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ") при работе с временем в формате UTC.

  2. Всегда преобразовывайте локальное время в UTC сначала с помощью .ToUniversalTime() перед применением формата ‘Z’, чтобы обеспечить правильное представление часового пояса.

  3. Спецификатор формата ‘K’ обеспечивает гибкость для различных видов DateTime и автоматически обрабатывает информацию о часовом поясе.

  4. Учитывайте требования к точности - базовый формат исключает миллисекунды, но при необходимости можно добавить их с помощью .fff или .fffffff.

  5. Для сериализации встроенные методы, такие как XmlConvert.ToString(), могут предоставить дополнительные возможности и проверку.

Ключевой вывод: DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ") - это наиболее прямой и надежный метод преобразования объектов DateTime в формате UTC в конкретный формат ISO 8601, который вы запросили.

Источники

  1. Microsoft Learn - Стандартные строки формата даты и времени
  2. Stack Overflow - Given a DateTime object, how do I get an ISO 8601 date in string format?
  3. Code Maze - Convert DateTime to ISO 8601 String in C#
  4. Dirask - C# / .NET - convert DateTime to iso 8601
  5. Reddit - How do you format date and time to ISO 8601 (YYYY-MM-DDThh:mmZ)?
Авторы
Проверено модерацией
Модерация