Юникс-таймстампы представляют собой количество секунд, прошедших с момента начала эпохи Unix — 1 января 1970 года, 00:00:00 по координированному всемирному времени (UTC). Они широко используются в приложениях и API для эффективного представления дат и времени. В этой статье рассматриваются несколько способов получения юникс-таймстампа в C#, сравниваются их эффективность и читаемость.
Содержание
- Эффективное получение юникс-таймстампа с помощью
DateTimeOffset
- Использование
DateTime
иTimeSpan
- Более ручной подход с
TimeSpan
- Заключение и лучшие практики
Эффективное получение юникс-таймстампа с помощью DateTimeOffset
Самый простой и рекомендуемый метод использует встроенный метод ToUnixTimeSeconds()
структуры DateTimeOffset
:
using System;
public class UnixTimestamp
{
public static long GetUnixTimestamp()
{
return DateTimeOffset.Now.ToUnixTimeSeconds();
}
public static void Main(string[] args)
{
long timestamp = GetUnixTimestamp();
Console.WriteLine($"Unix timestamp: {timestamp}");
}
}
DateTimeOffset
предпочтительнее DateTime
, поскольку он явно обрабатывает информацию о часовом поясе, предотвращая потенциальные ошибки при преобразовании часовых поясов. Этот метод краток, эффективен и легко обрабатывает потенциальные пограничные случаи.
Использование DateTime
и TimeSpan
Этот метод использует DateTime
и TimeSpan
для вычисления разницы между текущим временем и эпохой Unix:
using System;
public class UnixTimestamp
{
public static long GetUnixTimestamp()
{
DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (long)(DateTime.UtcNow - unixEpoch).TotalSeconds;
}
public static void Main(string[] args)
{
long timestamp = GetUnixTimestamp();
Console.WriteLine($"Unix timestamp: {timestamp}");
}
}
Этот подход немного более многословен, но все еще довольно читаем и эффективен. Использование DateTimeKind.Utc
имеет решающее значение для точности.
Более ручной подход с TimeSpan
Это демонстрирует более ручной расчет с использованием TimeSpan
, хотя он менее эффективен, чем предыдущие методы:
using System;
public class UnixTimestamp
{
public static long GetUnixTimestamp()
{
TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return (long)timeSpan.TotalSeconds;
}
public static void Main(string[] args)
{
long timestamp = GetUnixTimestamp();
Console.WriteLine($"Unix timestamp: {timestamp}");
}
}
Хотя и функционален, этот метод менее лаконичен и не предлагает никаких значительных преимуществ перед другими подходами.
Заключение и лучшие практики
Все три метода генерируют юникс-таймстампы, но DateTimeOffset.Now.ToUnixTimeSeconds()
является наиболее эффективным, читаемым и рекомендуемым подходом. Он встроен, правильно обрабатывает часовые пояса и минимизирует сложность кода. В большинстве сценариев этот метод предлагает наилучший баланс производительности и поддерживаемости. Не забывайте всегда использовать время UTC, чтобы избежать неоднозначности и обеспечить согласованные результаты в разных часовых поясах. Для чрезвычайно больших таймстампов (даты в далеком будущем) рассмотрите возможность использования целого типа большего размера, чтобы предотвратить потенциальные проблемы переполнения.