Как я могу генерировать временные метки Unix?
вопрос "Datetime к метке времени Unix", но этот вопрос более общий.
Мне нужны временные метки Unix для решения моего последний вопрос. мои интересы-Python, Ruby и Haskell, но другие подходы приветствуются.
каков самый простой способ генерации временных меток Unix?
15 ответов
в Linux или MacOS вы можете использовать:
date +%s
здесь
-
+%s
, секунды с 1970-01-01 00:00: 00 UTC. (GNU Coreutils 8.24 Date manual)
пример вывода теперь 1454000043.
в python добавьте следующие строки, чтобы получить отметку времени:
>>> import time
>>> time.time()
1335906993.995389
>>> int(time.time())
1335906993
команда "дата" unix удивительно универсальна.
date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s"
принимает выход date
, который будет в формате, определенном-f, а затем распечатает его (-j говорит, что не пытайтесь установить дату) в форме +%s, секунды с эпохи.
прежде всего, "эпоха" или нулевое время Unix-1970-01-01 00:00:00Z (что означает полночь 1 января 1970 года в часовом поясе Zulu или 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
.
В 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;
}
}
на Хаскелл
import Data.Time.Clock.POSIX
main :: IO ()
main = print . floor =<< getPOSIXTime
на Go
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 из сценария оболочки (семейство Борна: sh, ksh, bash, zsh, ...), это должно работать на любой машине Unix, так как в отличие от других предложений (perl, haskell, ruby, python, GNU date), оно основано на стандартной команде и функции POSIX.
PATH=`getconf PATH` awk 'BEGIN {srand();print srand()}'