?

Log in

No account? Create an account

August 7th, 2015

Интермузей

Мои твиты

  • Чт, 19:22: Эл Гор мог победить на выборах 2000, если бы не дизайн бюллетеней в FL. Люди ставили галку не там. У нас так делают? http://t.co/HpD7UD8TXu
Tags:
Интермузей

Timestamp или метка времени

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

В цифром мире все гораздо сложнее. С одной стороны должно быть просто - теже часы с минутами это цифры.

А вот недостаточно часов и минут для обоначения конкретного момента времени. 12:30 какого дня, какого месяца и года? В каком часовом поясе?  А день, месяц, год в какой системе координат вычислен, для какого календаря? В какой стране?

Вопросов миллион и маленькая тележка. Календарь это довольно сложная тема в цифровом мире. Не даром, мы имели уже проблему 200- года, ждем 2038.  Даже крупные компании сталкивались с проблемами в своих продуктах: так в Android 4.2 при выпуске не было декабря, а в ряде браузеров по Windows не было 7 января (было два шестых) или  его нельзя было выбрать в календаре.

Это было лирическое отступление. От которго через проблему 2038 года (прочитайте о ней сами в Википедии) я перейду к тому, о чем хотел написать.

В операционных системах семейства Unix (что может означать, в общем, в интернете) принято т.н. POSIX или UNIX-время. Это обычное число - количество секунд, прошедших с 00:00:00 UTC 1 января, 1970 года.

1 января 1970 года - именно эта дата является является точкой отсчета времени, может для кого-то это будет новостью :)

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

UNIX-timestamp - временная метка в UNIX это число секунд. В некоторых других системах используются другие форматы временных меток, например: 2005-10-30 10:45, Sat Jul 23 02:16:57 2005 или 20140812003842.

Последние удобны для восприятия человеком, сравните с 1438941705. Но UNIX-время гораздо удобнее для вычислений на компьютере.

И поэтому программисты постоянно (или просто часто) с этим сталкиваются.

В браузере, где используется JavaScript, время считается более точно, с точноcтью до миллисекунд. Чтобы перевести UNIXTIME, определенный на сервере и переданный в браузер нужно умножить его на 1000.


А вот как задача получения UNIX-timestamp и умножения решается в некоторых популярных языках программирования:




В PHP можно получить нужную временную метку так:


strtotime("2002-02-20 UTC") * 1000

В Python это можно сделать как-то так:


calendar.timegm(datetime_object.timetuple()) * 1000

В Ruby нужно использовать метод #to_i объекта Time. Если вы используете gem active_support (есть по-умолчанию в приложениях Ruby on Rails), то #to_i есть также у  объектов DateTime и ActiveSupport::TimeWithZone. Результат вызова нужно просто умножить на  1000:


Time.now.to_i * 1000     # => 1383582043000
# ActiveSupport examples:
DateTime.now.to_i * 1000 # => 1383582043000
ActiveSupport::TimeZone.new('Asia/Shanghai').now.to_i * 1000
# => 1383582043000

В .NET можно сделать примерно так:


public static int GetJavascriptTimestamp(System.DateTime input)
{
    System.TimeSpan span = new System.TimeSpan(System.DateTime.Parse("1/1/1970").Ticks);
    System.DateTime time = input.Subtract(span);
    return (long)(time.Ticks / 10000);
}



Источник: Flot reference




А вы уже умеете программировать?
Если нет, то как какой язык вам кажется проще по данному одному примеру?
Интермузей

December 2018

S M T W T F S
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

Tags

Powered by LiveJournal.com