ฉันจะสร้างการประทับเวลา Unix ได้อย่างไร


240

คำถามที่เกี่ยวข้องคือ"การประทับเวลาเป็นเวลา Unix"แต่คำถามนี้เป็นคำถามทั่วไป

ฉันต้องการบันทึกเวลา Unix เพื่อแก้คำถามสุดท้ายของฉัน ความสนใจของฉันคือ Python, Ruby และ Haskell แต่ก็ยินดีต้อนรับวิธีการอื่น ๆ

วิธีที่ง่ายที่สุดในการสร้างการประทับเวลา Unix คืออะไร?


ฉันทำเครื่องมือออนไลน์เมื่อไม่นานมานี้ quickhash.com/timestamp
AB Carroll

@ABCarroll คุณช่วยอธิบายได้ว่าในฐานะ anwer เครื่องมือออนไลน์ของคุณให้การประทับเวลาของ Unix ได้อย่างไร? กรุณาแนบคู่มือ ฯลฯ สำหรับมัน ดูเหมือนว่าจะให้ข้อมูลจำนวนมาก แต่ฉันไม่สามารถติดตามสิ่งที่เป็นเป้าหมายได้
LéoLéopold Hertz 준영

gettimeofdayPOSIX และ Linux ชื่อ syscall คือ: stackoverflow.com/questions/11765301/…สิ่งที่ต้องทำ: ทำไมstrace date +%dไม่เรียกมันว่า
Ciro Santilli 郝海东冠状病六四事件法轮功

หากคุณทำงานกับและเพิ่มช่วงเวลา (เช่นนาที, วัน, ชั่วโมง) ฉันได้เขียนเครื่องมือสำหรับการใช้งานของฉันเองเมื่อเร็ว ๆ นี้unixtime.ninja
Guy Thouret

คำตอบ:


472

ใน Linux หรือ MacOS คุณสามารถใช้:

date +%s

ที่ไหน

  • +%s, วินาทีตั้งแต่ 1970-01-01 00:00:00 UTC (GNU Coreutils 8.24 คู่มือวันที่)

ตัวอย่างเอาต์พุตตอนนี้ 1454000043


1
ใน Solaris: truss date 2> & 1 | grep ^ time | awk '{พิมพ์ $ 3}'
ĽubomírMlích

วันที่ BSD รองรับด้วย +% s อาจเป็นสากลdateตามที่กำหนดไว้ตามปกติใน POSIX.2
Dereckson

@ ĽubomírMlíchบนโฮสต์ SmartOS (SunOS 5.11 joyent_20171026T003127Z) ฉันใช้ทั้งคู่/usr/bin/date +%s and / usr / xpg4 / bin / date +% s` เมื่อรวมกับคำแนะนำ POSIX.2 ฉันคิดว่ามันใช้ได้กับ Solaris ทั้งหมดด้วย
Dereckson

หมายเหตุ: เพื่อเพิ่ม 60 วินาที: date -v+60S +%sเพื่อเพิ่ม 1 วัน: date -v+24H +%sและอื่น ๆ . .
gMale

วิธีสร้างมิลลิวินาทีไม่เกิน 3 หลักเท่านั้น
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

ในไพ ธ อนเพิ่มบรรทัดต่อไปนี้เพื่อรับการประทับเวลา:

>>> 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}
Craig Anderson


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, nanoseconds (000000000..999999999) นับตั้งแต่ยุค

1454000043.704350695ตัวอย่างการส่งออกในขณะนี้ ผมสังเกตเห็นคู่มือ BSD ที่ไม่ได้รวมถึงคำอธิบายที่แม่นยำเกี่ยวกับธงdate+%s


ทำไมคุณรวมถึงนาโนวินาทีโดย+$N? มันรวมอยู่ในการประทับเวลา UNIX ในบางระบบหรือไม่?
LéoLéopold Hertz 준영

2
FYI %Nไม่ได้จัดทำเอกสารหน้าคนสำหรับวันที่ใน macOS 10.13.1 (High Sierra) และไม่ทำงาน 1523342391.Nผลลัพธ์ของตัวอย่างที่ผมได้รับคือ:
nishanths

ใน macOS มีgdateHomebrew apple.stackexchange.com/a/135749/181223
phil pirozhkov

7

อย่างแรกสุดคือ 'ยุค' หรือ zero-time คือ 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

ในHaskell

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

ในแฮสเคลล์ ...

หากต้องการรับกลับเป็นประเภท 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ไม่ใช่วินาทีและเวลาประทับยูนิกซ์คือจำนวนsecondsที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970 00:00 UTC คุณสามารถใช้ JS เพียงแค่หารด้วย 1,000 และปัดเศษ:Math.round(Date.now()/1000)
Lukas Liesis

1
@LukasLiesis คงจะล่วงหน้ากาแฟวันนั้นผมได้ปรับปรุงคำตอบของฉัน แต่ฉันเลือกใช้สำหรับแทนMath.floor Math.roundไชโย
Madbreaks

0

หากคุณต้องการการประทับเวลา Unix จากเชลล์สคริปต์ (ตระกูล Bourne: 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 โดยใช้คำสั่ง date ฉันต้องใช้อาร์กิวเมนต์ -u กับคำสั่ง date

ตัวอย่าง

date -u

เอาท์พุต

Fri Jun 14 09:00:42 UTC 2019

0

nawk:

$ nawk 'BEGIN{print srand()}'
  • ใช้ได้แม้กับ Solaris เวอร์ชันเก่าและระบบ UNIX อื่น ๆ โดยที่ '' 'วันที่ +% s' '' ไม่ได้ติดตั้ง
  • ไม่ทำงานบน Linux และ distros อื่น ๆ ที่เครื่องมือ posix ถูกแทนที่ด้วยเวอร์ชัน GNU (nawk -> gawk เป็นต้น)
  • พริตตี้:

-1

ด้วย NodeJS เพียงเปิดเทอร์มินัลแล้วพิมพ์:
node -e "console.log(new Date().getTime())"หรือnode -e "console.log(Date.now())"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.