Як я можу генерувати часові позначки Unix?


240

Питання, пов’язане з цим, є "Datetime To Unix timetamp" , але це питання є більш загальним.

Для вирішення останнього питання мені потрібні часові позначки Unix . Мої інтереси - Python, Ruby та Haskell, але інші підходи вітаються.

Який найпростіший спосіб генерувати часові позначки Unix?


Я зробив онлайн-інструмент деякий час тому. quickhash.com/timestamp
AB Carroll

@ABCarroll Чи можете ви пояснити як відповідь, як ваш онлайн-інструмент забезпечує часові позначки Unix? Будь ласка, додайте до нього посібник тощо. Здається, вона надає багато даних, але я не можу реально слідкувати за ціллю.
Лео Леопольд Герц 준영

gettimeofdayє POSIX і Linux системний виклик ім'я: stackoverflow.com/questions/11765301 / ... TODO: чому strace date +%dне назвати?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Якщо ви працюєте з та часовими діапазонами приросту (наприклад, хвилини, дні, години), я нещодавно написав інструмент для власного використання unixtime.ninja
Гай Thouret,

Відповіді:


472

У Linux або MacOS ви можете використовувати:

date +%s

де

  • +%s, секунд з 1970-01-01 00:00:00 UTC. (Посібник з дати GNU Coreutils 8.24)

Приклад виведення зараз 1454000043.


1
Про Solaris: ферментова дата 2> & 1 | греп ^ час | awk '{print $ 3}'
Ľubomír Mlích

Дата BSD підтримує також +% s. Можливо, універсальним, як dateце зазвичай визначено в POSIX.2.
Дерексон

@ ĽubomírMlích На хості SmartOS (SunOS 5.11 joyent_20171026T003127Z) я /usr/bin/date +%s and / usr / xpg4 / bin / date +% s` працюю. У поєднанні з рекомендацією POSIX.2, я думаю, що це працює і на всіх Solaris.
Дерексон

Примітка: додати 60 секунд: date -v+60S +%sдодати 1 день: date -v+24H +%sі так далі. . .
gMale

Як генерувати мілісекунди до трьохзначних?
Parveen Verma

110

в Рубі:

>> Time.now.to_i
=> 1248933648

для рейок можна використовувати Time.zone.now.to_i. Хоча це дасть той же o / p, Time.now.to)_iале Time.zone.now.to_iце Railsшлях.
Обміни

У Rails ./bin/rails runner "p Time.current.to_i"- ще одне рішення.
gipcompany

18

У python додайте наступні рядки, щоб отримати позначку часу:

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

17

curl icanhazepoch.com

В основному це часові позначки Unix як послуга (UTaaS)


3
Хе, приємно. Це надихнуло мене додати подібну особливість до свого сайту хобі. curl -L -H "Accept: application/json" unixtimesta.mpдасть вам{"datetime":"Thu, 19 Jul 2018 12:01:21 GMT","timestamp":1532001681}
Крейг Андерсон


8

Команда unix 'date' напрочуд універсальна.

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

Виймає висновок date, який буде у форматі, визначеному -f, а потім роздруковує його (-j каже, що не намагайтеся встановити дату) у формі +% s, секунд з епохи.


4
date: invalid option -- 'j'
nyuszika7h

1
Це розширення дати GNU, не в стандарті Unix (POSIX).
jlliagre

8
$ date +%s.%N

де (посібник з дати GNU Coreutils 8.24)

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

Приклад виведення зараз 1454000043.704350695. Я помітив, що керівництво BSD dateне містить точних пояснень щодо прапора +%s.


Чому ви включаєте наносекунд +$N? Чи включається вона в часові позначки UNIX в деяких системах?
Лео Леопольд Герц 준영

2
FYI, %Nне задокументовано сторінку чоловіка на дату в macOS 10.13.1 (High Sierra) і не працює. Зразок виведення я отримав це: 1523342391.N.
nishanths


7

Перш за все, "епоха" або нульовий час 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"'


3

в Хаскелл

import Data.Time.Clock.POSIX

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

в Го

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

в С

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

2

У Haskell ...

Щоб повернути його як тип POSIXTime:

import Data.Time.Clock.POSIX
getPOSIXTime

Як ціле число:

import Data.Time.Clock.POSIX
round `fmap` getPOSIXTime

2
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;
        }
    }

2

Спробуємо JavaScript :

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

... або навіть приємніше, статичний підхід:

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

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


Це неправильно. Обидва способи повертають millisecondsне секунди, а часова мітка unix - це кількість, secondsщо минула з 1 січня 1970 р. 00:00 UTC. Ви можете використовувати JS, просто розділити на 1000 і круглим:Math.round(Date.now()/1000)
Лукас Лієсіс

1
@LukasLiesis, напевно, в той день була попередньо кава, я оновив свою відповідь, хоча вибрав Math.floorзамість цього Math.round. Ура
Madbreaks

0

Якщо вам потрібна часова мітка Unix з сценарію оболонки (сімейство Борна: sh, ksh, bash, zsh, ...), це повинно працювати на будь-якій машині Unix, на відміну від інших пропозицій (perl, haskell, ruby, python, GNU date ), вона заснована на стандартній команді та функції POSIX.

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

0

У Bash 5 є нова змінна:

echo $EPOCHSECONDS

Або якщо ви хочете більш високої точності (в мікросекундах):

echo $EPOCHREALTIME

0

Якщо я хочу надрукувати час utc дати за допомогою команди date, мені потрібно використовувати аргумент -u з командою date.

Приклад

date -u

Вихідні дані

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • Працює навіть у старих версіях Solaris та, ймовірно, інших системах UNIX, де '' 'дата +% s' '' не реалізовано
  • Не працює в Linux та інших дистрибутивах, де інструменти posix були замінені версіями GNU (nawk -> gawk тощо)
  • Досить неінтуїтивно, але безумовно кумедно :-)

-1

За допомогою NodeJS просто відкрийте термінал і введіть:
node -e "console.log(new Date().getTime())"абоnode -e "console.log(Date.now())"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.