Как я могу генерировать временные метки Unix?


связанный вопрос - это "Datetime to Unix timestamp", но этот вопрос более общий.

Мне нужны временные метки Unix, чтобы решить мой последний вопрос. Мои интересы-Python, Ruby и Haskell, но другие подходы приветствуются.

каков самый простой способ создания временных меток Unix?

15 169

15 ответов:

в Linux или MacOS вы можете использовать:

date +%s

здесь

  • +%s, секунд с 1970-01-01 00:00: 00 UTC. (GNU Coreutils 8.24 руководство по датам)

пример вывода теперь 1454000043.

в Ruby:

>> Time.now.to_i
=> 1248933648

в python добавьте следующие строки, чтобы получить отметку времени:

>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993

curl icanhazepoch.com

в основном это временные метки unix как сервис (UTaaS)

В Perl:

>> time
=> 1335552733

команда unix 'date' удивительно универсальна.

date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"

принимает вывод date, который будет в формате, определенном-f, а затем распечатает его (-j говорит, что не пытается установить дату) в виде +%s, секунд с момента эпохи.

прежде всего, "эпоха" Unix или нулевое время-1970-01-01 00:00:00Z (что означает полночь 1 января 1970 года в часовом поясе зулу или GMT или UTC). Метка времени Unix - это количество секунд с этого времени, не считая секунд прыжка.

генерация текущего времени в Perl довольно проста:

perl -e 'print time, "\n"'

генерация времени, соответствующего заданному значению даты/времени, гораздо менее проста. Логически, вы используете strptime() функция из POSIX. Однако Perl POSIX:: strptime модуль (который отделен от модуля POSIX) имеет подпись:

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = 
                                     POSIX::strptime("string", "Format");

функции mktime в модуле POSIX имеется подпись:

mktime(sec, min, hour, mday, mon, year, wday = 0, yday = 0, isdst = 0)

Итак, если вы знаете формат ваших данных, вы можете написать вариант:

perl -MPOSIX -MPOSIX::strptime -e \
    'print mktime(POSIX::strptime("2009-07-30 04:30", "%Y-%m-%d %H:%M")), "\n"'
$ date +%s.%N

где (GNU Coreutils 8.24 Date manual)

  • +%s, секунд с 1970-01-01 00:00: 00 UTC
  • +%N, наносекундах (000000000..999999999) с эпохи

пример вывода теперь 1454000043.704350695. Я заметил, что руководство BSD date не включил точное объяснение о флаге +%s.

для полноты, PHP:

php -r 'echo time();'

в bash:

clitime=$(php -r 'echo time();')
echo $clitime

В Haskell...

, чтобы получить его обратно в качестве типа POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

как целое число:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime
public static Int32 GetTimeStamp()
    {
        try
        {
            Int32 unixTimeStamp;
            DateTime currentTime = DateTime.Now;
            DateTime zuluTime = currentTime.ToUniversalTime();
            DateTime unixEpoch = new DateTime(1970, 1, 1);
            unixTimeStamp = (Int32)(zuluTime.Subtract(unixEpoch)).TotalSeconds;
            return unixTimeStamp;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            return 0;
        }
    }

на Haskell

import Data.Time.Clock.POSIX

main :: IO ()
main = print . floor =<< getPOSIXTime

на перейти

import "time"
t := time.Unix()

на C

time(); // in time.h POSIX

// for Windows time.h
#define UNIXTIME(result)   time_t localtime; time(&localtime); struct tm* utctime = gmtime(&localtime); result = mktime(utctime);

на Свифт

NSDate().timeIntervalSince1970 // or Date().timeIntervalSince1970

С NodeJS, просто откройте терминал и введите:
node -e "console.log(new Date().getTime())" или node -e "console.log(Date.now())"

попробуем JavaScript:

var t = Math.floor((new Date().getTime()) / 1000);

...или еще приятнее, статический подход:

var t = Math.floor(Date.now() / 1000);

в обоих случаях я делю 1000 чтобы перейти от секунд до Миллис и я использую Math.floor только для представления целых секунд, которые прошли (против округления, которое может округлить до целой секунды, которая еще не прошла).

Если вам нужна временная метка Unix из сценария оболочки (семейство Bourne: sh, ksh, bash, zsh, ...), это должно работать на любой машине Unix, так как в отличие от других предложений (perl, haskell, ruby, python, GNU date), он основан на стандартной команде и функции POSIX.

PATH=`getconf PATH` awk 'BEGIN {srand();print srand()}'