Как я могу генерировать временные метки Unix?
связанный вопрос - это "Datetime to Unix timestamp", но этот вопрос более общий.
Мне нужны временные метки Unix, чтобы решить мой последний вопрос. Мои интересы-Python, Ruby и Haskell, но другие подходы приветствуются.
каков самый простой способ создания временных меток Unix?
15 ответов:
в Linux или MacOS вы можете использовать:
date +%s
здесь
+%s
, секунд с 1970-01-01 00:00: 00 UTC. (GNU Coreutils 8.24 руководство по датам)пример вывода теперь 1454000043.
в python добавьте следующие строки, чтобы получить отметку времени:
>>> import time >>> time.time() 1335906993.995389 >>> int(time.time()) 1335906993
команда 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
. Я заметил, что руководство BSDdate
не включил точное объяснение о флаге+%s
.
В 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()}'