Как преобразовать 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
- Альтернативные варианты форматирования
- Важные замечания
- Полные примеры
Базовый метод преобразования
Простейший способ преобразования DateTime.UtcNow в желаемый формат ISO 8601:
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.UtcDateTimeKind.LocalDateTimeKind.Unspecified
Для разных видов требуются разные подходы:
Для DateTime в формате UTC
DateTime utcTime = DateTime.UtcNow;
string isoUtc = utcTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
// Вывод: 2023-05-11T14:30:45Z
Для DateTime в локальном формате
DateTime localTime = DateTime.Now;
// Сначала преобразуем в UTC, затем форматируем
string isoLocal = localTime.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
// Вывод: 2023-05-11T14:30:45Z (предполагая, что ваше локальное время - UTC+0)
Для DateTime с неопределенным форматом
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’ автоматически обрабатывает информацию о часовом поясе:
string isoWithK = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssK");
// Вывод: 2023-05-11T14:30:45Z
Спецификатор ‘K’:
- Выводит ‘Z’ для времени в формате UTC
- Выводит смещение, например ‘+05:00’, для локального времени
- Не выводит информацию о часовом поясе для неопределенного времени
Использование стандартных форматов ‘O’ или ‘o’
Стандартные спецификаторы формата обеспечивают соответствие стандарту ISO 8601, но включают миллисекунды:
string isoWithO = DateTime.UtcNow.ToString("O");
// Вывод: 2023-05-11T14:30:45.1234567Z
string isoWitho = DateTime.UtcNow.ToString("o");
// Результат такой же, как выше
Важные замечания
Осведомленность о часовом поясе
При преобразовании локального времени всегда сначала преобразуйте в UTC для использования суффикса ‘Z’:
// Правильный подход
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) не включает миллисекунды. Если требуется более высокая точность, рассмотрите:
// С миллисекундами
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:
// Сериализация XML
string xmlDate = XmlConvert.ToString(DateTime.UtcNow, XmlDateTimeSerializationMode.Utc);
// Сериализация JSON (с использованием System.Text.Json)
Полные примеры
Базовый метод преобразования
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
}
}
Работа с различными часовыми поясами
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
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")}");
}
}
Заключение
-
Для точного формата
yyyy-MM-ddTHH:mm:ssZиспользуйтеDateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")при работе с временем в формате UTC. -
Всегда преобразовывайте локальное время в UTC сначала с помощью
.ToUniversalTime()перед применением формата ‘Z’, чтобы обеспечить правильное представление часового пояса. -
Спецификатор формата ‘K’ обеспечивает гибкость для различных видов DateTime и автоматически обрабатывает информацию о часовом поясе.
-
Учитывайте требования к точности - базовый формат исключает миллисекунды, но при необходимости можно добавить их с помощью
.fffили.fffffff. -
Для сериализации встроенные методы, такие как
XmlConvert.ToString(), могут предоставить дополнительные возможности и проверку.
Ключевой вывод: DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ") - это наиболее прямой и надежный метод преобразования объектов DateTime в формате UTC в конкретный формат ISO 8601, который вы запросили.
Источники
- Microsoft Learn - Стандартные строки формата даты и времени
- Stack Overflow - Given a DateTime object, how do I get an ISO 8601 date in string format?
- Code Maze - Convert DateTime to ISO 8601 String in C#
- Dirask - C# / .NET - convert DateTime to iso 8601
- Reddit - How do you format date and time to ISO 8601 (YYYY-MM-DDThh:mmZ)?