rusqhyazeubebgcahrcsdanlenetfifrglkadeelhuisgaitkkkylvltmknoplptrosrskslessvtrukuz

Преобразовать метку времени Unix в DateTime и наоборот - C#

Больше
3 мес. 4 нед. назад #153 от О.Коровяков
Вот что вам нужно:
public static DateTime UnixTimeStampToDateTime( double unixTimeStamp )
{
    // Unix timestamp is seconds past epoch
    System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
    dtDateTime = dtDateTime.AddSeconds( unixTimeStamp ).ToLocalTime();
    return dtDateTime;
}

В последней версии.NET(v4.6) добавлена встроенная поддержка конверсий времени Unix. Это включает в себя и время Unix, представляемое либо секундами, либо миллисекундами.

Unix время в секундах до UTC DateTimeOffset:
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
DateTimeOffset для Unix время в секундах:
long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
Время Unix в миллисекундах до UTC DateTimeOffset:
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
DateTimeOffset для времени Unix в миллисекундах:
long unixTimeStampInMilliseconds = dateTimeOffset.ToUnixTimeMilliseconds();
Примечание. Эти методы преобразуются в UTC DateTimeOffset и обратно. Чтобы получить представление DateTime просто используйте свойства
DateTimeOffset.UtcDateTime или DateTimeOffset.LocalDateTime:
DateTime dateTime = dateTimeOffset.UtcDateTime;


"UTC не изменяется с изменением сезонов, но местное время или гражданское время могут измениться, если юрисдикция часового пояса наблюдает летнее время (летнее время). Например, UTC на 5 часов вперед (то есть позже в день, чем) местное время на восточном побережье Соединенных Штатов в зимний период, но на 4 часа вперед, в то время как летнее время наблюдается там".

Итак, это мой код:
TimeSpan span = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0,DateTimeKind.Utc));
double unixTime = span.TotalSeconds;

Будьте осторожны, если вам нужна точность выше миллисекунды!
Методы.NET(v4.6) (например, FromUnixTimeMilliseconds) не обеспечивают эту точность.
AddSeconds и AddMilliseconds также отключили микросекунды в Double.

Эти версии имеют высокую точность:

Unix → DateTime
public static DateTime UnixTimestampToDateTime(double unixTime)
{
    DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
    long unixTimeStampInTicks = (long) (unixTime * TimeSpan.TicksPerSecond);
    return new DateTime(unixStart.Ticks + unixTimeStampInTicks, System.DateTimeKind.Utc);
}
DateTime → Unix
public static double DateTimeToUnixTimestamp(DateTime dateTime)
{
    DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
    long unixTimeStampInTicks = (dateTime.ToUniversalTime() - unixStart).Ticks;
    return (double) unixTimeStampInTicks / TimeSpan.TicksPerSecond;
}

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 4 нед. назад #154 от О.Коровяков
public static class EpochTimeExtensions
{
    /// <summary>
    /// Converts the given date value to epoch time.
    /// </summary>
    public static long ToEpochTime(this DateTime dateTime)
    {
        var date = dateTime.ToUniversalTime();
        var ticks = date.Ticks - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
        var ts = ticks / TimeSpan.TicksPerSecond;
        return ts;
    }
 
    /// <summary>
    /// Converts the given date value to epoch time.
    /// </summary>
    public static long ToEpochTime(this DateTimeOffset dateTime)
    {
        var date = dateTime.ToUniversalTime();
        var ticks = date.Ticks - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero).Ticks;
        var ts = ticks / TimeSpan.TicksPerSecond;
        return ts;
    }
 
    /// <summary>
    /// Converts the given epoch time to a <see cref="DateTime"/> with <see cref="DateTimeKind.Utc"/> kind.
    /// </summary>
    public static DateTime ToDateTimeFromEpoch(this long intDate)
    {
        var timeInTicks = intDate * TimeSpan.TicksPerSecond;
        return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddTicks(timeInTicks);
    }
 
    /// <summary>
    /// Converts the given epoch time to a UTC <see cref="DateTimeOffset"/>.
    /// </summary>
    public static DateTimeOffset ToDateTimeOffsetFromEpoch(this long intDate)
    {
        var timeInTicks = intDate * TimeSpan.TicksPerSecond;
        return new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero).AddTicks(timeInTicks);
    }
}

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 4 нед. назад - 3 мес. 4 нед. назад #155 от О.Коровяков
Чтобы дополнить ответ, я недавно оказался в раздражающем сценарии наличия секунд и миллисекунд. Временные метки UNIX произвольно перемешиваются во входном наборе данных. Следующий код, похоже, справляется с этим:
static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
static readonly double MaxUnixSeconds = (DateTime.MaxValue - UnixEpoch).TotalSeconds;
 
public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
{
   return unixTimeStamp > MaxUnixSeconds
      ? UnixEpoch.AddMilliseconds(unixTimeStamp)
      : UnixEpoch.AddSeconds(unixTimeStamp);
}
Последнее редактирование: 3 мес. 4 нед. назад пользователем О.Коровяков.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подпишитесь на наши новости...

Если вам интересны материалы опубликованных на Нашем сайте, Вы можете подписаться на рассылку информационных бюллетеней о новых публикациях ... Просто введите адрес электронной почты на какую Вы хотите получать Новости и нажмите кнопку "Подписаться"

Контакт Инфо

Ok-Wood.
08304 ул.Салютная,c.Гнедын,
Киевская обл, Украина
  • Тел: +39 067 492 41 24
    Tel: +38 095 095 88 60
  • Email: info@ok-wood.com.ua
  • Web: ok-wood.com.ua

Весь процесс строительства описан на страницах сайта, но более подробно о технологии, методах строительства, и всех деталях - Вы можете узнать в книге.