Как я могу генерировать временные метки 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()}'