Разбор времени unix в C #

Есть ли способ быстро / легко проанализировать время Unix на C #? Я новичок в этом языке, поэтому, если это до боли очевидный вопрос, прошу прощения. IE У меня есть строка в формате [секунды с начала эпохи]. [Миллисекунды]. Есть ли в C # эквивалент Java SimpleDateFormat?


person Alex Marshall    schedule 04.11.2009    source источник


Ответы (9)


Самый простой способ - это использовать что-то вроде:

private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 
                                                      DateTimeKind.Utc);

...
public static DateTime UnixTimeToDateTime(string text)
{
    double seconds = double.Parse(text, CultureInfo.InvariantCulture);
    return Epoch.AddSeconds(seconds);
}

Обратите внимание на три вещи:

  • Если ваши строки определенно имеют форму «x.y», а не «x, y», вы должны использовать инвариантную культуру, как показано выше, чтобы убедиться, что «.» анализируется как десятичная точка
  • Вы должны указать UTC в конструкторе DateTime, чтобы убедиться, что он не считает, что это местное время.
  • Если вы используете .NET 3.5 или выше, вы можете рассмотреть возможность использования DateTimeOffset вместо DateTime.
person Jon Skeet    schedule 04.11.2009

Это обычное дело для C #, но для этого нет библиотеки.

Я создал эту мини-библиотеку https://gist.github.com/1095252, чтобы сделать свою жизнь (я надеюсь, ваш тоже) проще.

person Andrius Bentkus    schedule 20.07.2011

// This is an example of a UNIX timestamp for the date/time 11-04-2005 09:25.
double timestamp = 1113211532;

// First make a System.DateTime equivalent to the UNIX Epoch.
System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);

// Add the number of seconds in UNIX timestamp to be converted.
dateTime = dateTime.AddSeconds(timestamp);

// The dateTime now contains the right date/time so to format the string,
// use the standard formatting methods of the DateTime object.
string printDate = dateTime.ToShortDateString() +" "+ dateTime.ToShortTimeString();

// Print the date and time
System.Console.WriteLine(printDate);

Surce: http://www.codeproject.com/KB/cs/timestamp.aspx

person Chris Ballance    schedule 04.11.2009

Я понимаю, что это довольно старый вопрос, но я решил опубликовать свое решение, в котором использовался класс Nodatime Instant, который имеет специальный метод для этого.

Instant.FromSecondsSinceUnixEpoch(longSecondsSinceEpoch).ToDateTimeUtc();

Я полностью понимаю, что, возможно, тяга в Nodatime может быть тяжелой для некоторых людей. Для моих проектов, где раздувание зависимостей не является серьезной проблемой, я предпочитаю полагаться на поддерживаемые библиотечные решения, а не на собственные.

person ojintoad    schedule 09.07.2015

Начиная с .NET 4.6, вы можете использовать DateTimeOffset.FromUnixTimeSeconds() и DateTimeOffset.FromUnixTimeMilliseconds():

long unixTime = 1600000000;
DateTimeOffset dto = DateTimeOffset.FromUnixTimeSeconds(unixTime);
DateTime dt = dto.DateTime;
person Christian Davén    schedule 28.09.2020


Ура MSDN DateTime docs! См. Также TimeSpan.

// First make a System.DateTime equivalent to the UNIX Epoch.
System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
// Add the number of seconds in UNIX timestamp to be converted.
dateTime = dateTime.AddSeconds(numSeconds);
// Then add the number of milliseconds
dateTime = dateTime.Add(TimeSpan.FromMilliseconds(numMilliseconds));
person Matt Ball    schedule 04.11.2009
comment
Отредактированная версия вашего сообщения в порядке. Однако первая версия была действительно бесполезной, поскольку на связанной странице MSDN нет образца для временных меток UNIX, а DateTime не имеет встроенной функции, которую вы могли бы найти на этой странице. Теперь, когда вы отредактировали ответ, он такой же, как и другие. - person OregonGhost; 04.11.2009

Вот это как удобный метод расширения

  public static DateTime UnixTime(this string timestamp)
    {
        var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        return dateTime.AddSeconds(int.Parse(timestamp));
    }
person Kristian Schneider    schedule 10.10.2014

person    schedule
comment
Я полагаю, это приведет к неуказанному DateTimeKind. Он также будет использовать местную культуру для определения формата десятичной точки. - person Jon Skeet; 04.11.2009