как преобразовать временную метку unix в datetime

Я пытаюсь преобразовать эту временную метку unix 1415115303410 в DateTime следующим образом:

private static DateTime UnixTimeStampToDateTime(long unixTimeStamp)
{
        System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
        dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp);
        return dtDateTime;
}

Но я получаю неправильную дату: Дата: {04/11/0045 00:00:00}

ПРИМЕЧАНИЕ. dtDateTime.AddSeconds (unixTimeStamp) вызывает исключение .. мое число указано в миллисекундах.

с помощью этого онлайн-инструмента преобразования http://www.epochconverter.com/ я получаю правильное преобразование:

11.04.2014 15:35:03 GMT + 0: 00

Как я могу это преобразовать?


person DevT    schedule 03.02.2015    source источник
comment
Возможный дубликат stackoverflow.com/questions/249760/   -  person João Miguel Brandão    schedule 03.02.2015
comment
Я бы сказал, что вместо этого вам нужно AddSeconds?   -  person João Miguel Brandão    schedule 03.02.2015
comment
@ JoãoMiguelBrandão это не дубликат, потому что преобразование в этой статье не работает   -  person DevT    schedule 03.02.2015
comment
@ JoãoMiguelBrandão AddSeconds выдает исключение, 1415115303410 находится в миллисекундах   -  person DevT    schedule 03.02.2015
comment
Вы уверены, что вызываете этот метод?   -  person Ofiris    schedule 03.02.2015
comment
возможный дубликат Как преобразовать время эпохи в C #?   -  person Ofiris    schedule 03.02.2015
comment
Возможный дубликат Как преобразовать временную метку Unix в DateTime и наоборот?   -  person BobbyA    schedule 13.12.2017
comment
Что ж, тогда вопрос неверен, если число, которое вы хотите преобразовать, не является unixtimestamp. Разделите на 1000, и тогда это будет unixtimestamp, который вы можете преобразовать   -  person louigi600    schedule 13.03.2021


Ответы (8)


Ваш код работает нормально, как есть. Вот скрипка.

Все, кто говорит вам использовать AddSeconds, ошибаются. Число, которое вы нам даете, явно выражено в миллисекундах. В году 31 536 000 секунд. 1415115303410 разделить на 31536000 - это 4487. С 01.01.1970 не прошло 4487 лет.

person Icemanind    schedule 03.02.2015
comment
Это дает правильную дату, но неправильное время. Эта дата: 1503583200123 - 25 августа 2017 года в 9:00, но ваш код дает мне 25 августа 2017 года в 14:00. - person DevShadow; 25.08.2017
comment
@DevShadow Это, вероятно, проблема с часовым поясом. В своей скрипке я использую время UTC. 14:00, вероятно, правильное время для вашего часового пояса. - person Icemanind; 26.08.2017
comment
Извлеченный урок. Будьте осторожны, если вы используете миллисекунды. или сек. как показано здесь - person Timo; 18.11.2020
comment
временная метка unix - это количество секунд с 1 января 1970 г., 00:00 UTC, поэтому вам может потребоваться исправить свой часовой пояс - person louigi600; 13.03.2021

используйте AddSeconds вместо AddMilliseconds

 private static DateTime UnixTimeStampToDateTime(long unixTimeStamp) 
 {
    System.DateTime dtDateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
    dtDateTime = dtDateTime.AddSeconds(unixTimeStamp);
    return dtDateTime;
 }
person Shafqat Masood    schedule 03.02.2015
comment
Как я уже сказал, AddSeconds выдает исключение, мой номер в миллисекундах - person DevT; 03.02.2015
comment
неужели так сложно разделить на 1000 и превратить это в секунды? - person louigi600; 13.03.2021

Просто используйте DateTimeOffset

DateTimeOffset date = DateTimeOffset.FromUnixTimeSeconds(1415115303410)

person Make Makeluv    schedule 02.06.2017

public DateTime FromUnixTime(long unixTime)
{
    var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    return epoch.AddMilliseconds(unixTime);
}

var date = FromUnixTime(1415115303410); // 11/4/2014 3:35:03 PM

Поскольку ваше число выражается в миллисекундах, время Unix используйте AddMilliseconds.

person Ofiris    schedule 03.02.2015
comment
Я не вижу, чем это отличается от того, что опубликовал OP. Однако это работает. Я думаю, что, как говорит @icemanind, код OP уже работает. dotnetfiddle.net/pGF3km - person crthompson; 03.02.2015
comment
Правильно, это точно так же, я думал у него там AddSeconds (запутался из последних правок), все-таки это правильный ответ ... - person Ofiris; 03.02.2015

Попробуй это

DateTime date = new DateTime(Convert.ToInt64("1415115303410"));
person Muhammed    schedule 21.11.2016
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, это снижает удобочитаемость как кода, так и пояснений! - person kayess; 21.11.2016

Microsoft продолжает думать о нас! Все решения для добавления секунд / миллисекунд не работают с Visual Studio 2017 (.Net 4.6.1). Но есть новое решение:


public static DateTime numStrToDate(String val)
{
    DateTime dRet = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    long dSec;
    if (long.TryParse(val, out dSec))
    {
        TimeSpan ts = new TimeSpan(dSec*10l);
        dRet = dRet.Add(ts);
    }
    return dRet;
}

Если вам нужно время в формате UTC - просто добавьте System.DateTimeKind.Utc в вызов конструктора DateTime.

person Алексей Штыков    schedule 14.11.2017

Дата в метку времени

 DateTime date = DateTime.ParseExact(date_string, "dd/MM/yyyy H:mm:ss", null);
 Double timestamp = Math.Truncate((date.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalSeconds);

Отметка времени до даты

 DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Unspecified);
 dtDateTime = dtDateTime.AddSeconds(Double.Parse(arrayFinalResponse[i, 5])).ToLocalTime();
 String date = dtDateTime.ToString("dd/MM/yyyy H:mm:ss", CultureInfo.GetCultureInfo("en-US"));
person Роман Зыков    schedule 02.09.2017

Вы можете выполнить преобразование, используя небольшой трюк с командой даты. Это зависит от вашего часового пояса. Я живу в UTC + 1, поэтому для меня это так:

h1x1binax:~ # date -d "Thu Jan  1 01:00:00 CET 1970 + 1415115303410 second"
Thu Mar 21 09:16:50 CET 46813
h1x1binax:~ #

Так что это не временная метка unixtime ... вероятно, в миллисекундах, поэтому нужно разделить на 1000

h1x1binax:~ # date -d "Thu Jan  1 01:00:00 CET 1970 + 1415115303 second"
Tue Nov  4 16:35:03 CET 2014
h1x1binax:~ #
person louigi600    schedule 25.02.2020