В мире программирования часто возникает необходимость работать с временными метками, особенно при взаимодействии с различными API или системами хранения данных. В этой статье мы рассмотрим, как в языке программирования C# произвести конвертацию между Unix временными метками (Unix Timestamp) и объектами DateTime, а также обратное преобразование из DateTime в Unix Timestamp.
Что такое Unix Timestamp?
Unix временная метка (Unix Timestamp) — это количество секунд, прошедших с полуночи (00:00:00) 1 января 1970 года по координированному всемирному времени (UTC), не считая високосные секунды. Эта дата известна как “эпоха Unix” и используется в операционных системах на базе Unix для представления временных точек.
Преобразование Unix Timestamp в DateTime
Для конвертации Unix временной метки в объект DateTime в C# достаточно использовать конструктор класса DateTime и добавить к начальной точке отсчета необходимое количество секунд. Пример кода ниже показывает, как это можно сделать:
int unixTimestamp = 1617181200; // Пример Unix временной метки
System.DateTime epoch = new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc);
System.DateTime dateTime = epoch.AddSeconds(unixTimestamp);
Здесь переменная epoch
представляет начальную точку отсчета, а метод AddSeconds
добавляет к этой дате количество секунд, указанное в Unix временной метке.
Преобразование DateTime в Unix Timestamp
Для выполнения обратного преобразования, т.е. конвертации объекта DateTime обратно в Unix временную метку, нужно вычесть начальную точку отсчета из заданной даты и преобразовать результат в количество секунд:
System.DateTime dateTime = new System.DateTime(2021, 3, 31, 0, 0, 0, System.DateTimeKind.Utc);
System.DateTime epoch = new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc);
int unixTimestamp = (int)(dateTime - epoch).TotalSeconds;
В этом примере мы вычитаем epoch
из dateTime
, а затем используем свойство TotalSeconds
для получения количества секунд, которое и будет соответствовать Unix временной метке.
Учет часовых поясов
Работая с временем, важно учитывать часовые пояса. В примерах выше мы использовали UTC, что является стандартом для Unix Timestamp. Однако, если ваш DateTime находится в другом часовом поясе, его необходимо сначала преобразовать в UTC:
System.DateTime localDateTime = System.DateTime.Now; // Локальное время
System.DateTime utcDateTime = localDateTime.ToUniversalTime(); // Преобразование в UTC
int unixTimestamp = (int)(utcDateTime - epoch).TotalSeconds;
Аналогично, при преобразовании Unix Timestamp в DateTime, нужно учитывать, в каком часовом поясе вы хотите получить результат:
int unixTimestamp = 1617181200;
System.DateTime dateTimeUtc = epoch.AddSeconds(unixTimestamp); // Время в UTC
System.DateTime localDateTime = dateTimeUtc.ToLocalTime(); // Преобразование в локальное время
Работа с миллисекундами
Иногда Unix Timestamp может быть представлен в миллисекундах. В таком случае необходимо адаптировать код, чтобы учитывать это:
long unixTimestampMillis = 1617181200000; // Unix Timestamp в миллисекундах
System.DateTime dateTime = epoch.AddMilliseconds(unixTimestampMillis);
Обратное преобразование также требует деления или умножения на 1000 для корректной конвертации между секундами и миллисекундами.
Работа с DateTimeOffset
В C# существует тип DateTimeOffset
, который представляет дату и время с учетом смещения часового пояса. Конвертация между Unix Timestamp и DateTimeOffset
выполняется аналогично:
int unixTimestamp = 1617181200;
System.DateTimeOffset dateTimeOffset = epoch.AddSeconds(unixTimestamp);
// И обратно
int unixTimestampFromOffset = (int)(dateTimeOffset - epoch).TotalSeconds;
Заключение
Конвертация между Unix Timestamp и DateTime в C# является частой задачей для многих программистов. Понимание того, как это делается, и учет часовых поясов, миллисекунд и смещений важно для работы с временем в приложениях. Следуя приведенным в этой статье примерам и рекомендациям, вы сможете легко преобразовывать временные метки в даты и наоборот, обеспечивая корректную работу вашего программного обеспечения.