Я посмотрел вокруг stackoverflow и даже посмотрел на некоторые из предложенных вопросов, и никто, кажется, не отвечает, как вы получаете метку времени Unix в C #?
c#
timestamp
unix-timestamp
bizzehdee
источник
источник
Ответы:
Вы получаете метку времени Unix в C #, используя
DateTime.UtcNow
и вычитая время эпохи 1970-01-01.например
DateTime.UtcNow
может быть заменен любымDateTime
объектом, для которого вы хотите получить метку времени Unix.Существует также поле,
DateTime.UnixEpoch
которое очень плохо документировано MSFT, но может заменитьnew DateTime(1970, 1, 1)
источник
DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).Ticks / TimeSpan.TicksPerSecond;
Начиная с .NET 4.6, есть
DateTimeOffset.ToUnixTimeSeconds()
.Это метод экземпляра, поэтому вы должны вызывать его для экземпляра
DateTimeOffset
. Вы также можете разыграть любой экземплярDateTime
, хотя остерегайтесь часового пояса .Чтобы получить текущую метку времени:
Чтобы получить метку времени из
DateTime
:источник
Int64
- к тому времени, когда перевернется, мы больше не будем использовать земные годы из-за отсутствия Земли.DateTimeOffset.Now.ToUnixTimeSeconds()
Вы также можете использовать тики. Я пишу для Windows Mobile, поэтому не имею полного набора методов. TotalSeconds не доступен для меня.
или
источник
new DateTime(1970, 1, 1)
создает время с неопределеннымKind
свойством. То, что вы действительно хотите, чтобыnew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
быть по-настоящему правильнымЭто то, что я использую:
Имейте в виду, что этот метод будет возвращать время в формате UTC.
источник
double
тип, литье это долго может привести к потере точности.)Усечение
.TotalSeconds
важно, так как оно определяется какthe value of the current System.TimeSpan structure expressed in whole fractional seconds.
А как насчет расширения для
DateTime
? Второе, вероятно, более запутанно, чем стоит расширение свойств.источник
Когда вы вычитаете 1970 из текущего времени, имейте в виду, что временной интервал чаще всего будет иметь поле, отличное от нуля миллисекунд. Если по какой-то причине вас интересуют миллисекунды, имейте это в виду.
Вот что я сделал, чтобы обойти эту проблему.
источник
Это то, что я использую.
источник
Я собрал воедино самые элегантные подходы к этому служебному методу:
источник
Это решение помогло в моей ситуации:
используя помощник в коде:
источник
Для SystemTimeOffset в системе существует значение ToUnixTimeMilliseconds
Вы можете написать аналогичный метод для DateTime:
10000000L - преобразование тиков в секунды
62135596800L - преобразование с 01.01.01 по 01.01.1978
Нет проблем с Utc и утечками
источник
Ниже приведен двухсторонний класс расширения, который поддерживает:
В случае OP, использование:
или
Хотя прямой ответ существует, я считаю, что лучше использовать общий подход. Тем более, что это, скорее всего, проект, который нуждается в таком преобразовании, в любом случае также потребует этих расширений, поэтому лучше использовать один и тот же инструмент для всех.
источник
Я использовал это после некоторой борьбы, это также учитывает смещение часового пояса:
источник
Простой код, который я использую:
Этот код дает метку времени Unix, общее количество миллисекунд с 1970-01-01 по настоящее время.
источник