ฉันจะแปลงเวลาประทับของยุคเป็นรูปแบบที่มนุษย์อ่านได้บน cli ได้อย่างไร


183

ฉันจะแปลงเวลาประทับของยุคเป็นรูปแบบที่มนุษย์อ่านได้บน cli ได้อย่างไร ฉันคิดว่ามีวิธีที่จะทำกับวันที่ แต่ไวยากรณ์ฉันพ้น (วิธีอื่น ๆ ยินดีต้อนรับ)

คำตอบ:


268

ใน * BSD:

date -r 1234567890

บน Linux (โดยเฉพาะกับ GNU coreutils ≥5.3):

date -d @1234567890

ด้วยรุ่น GNU เวอร์ชั่นเก่าคุณสามารถคำนวณความแตกต่างสัมพัทธ์กับยุค UTC:

date -d '1970-01-01 UTC + 1234567890 seconds'

หากคุณต้องการพกพาคุณจะโชคดี ครั้งเดียวที่คุณสามารถจัดรูปแบบด้วยบรรทัดคำสั่งเชลล์ POSIX (โดยไม่ทำการคำนวณด้วยตัวเอง) คือเวลาปัจจุบัน ในทางปฏิบัติ Perl มักมีให้ใช้งาน:

perl -le 'print scalar localtime $ARGV[0]' 1234567890

4
+1 สำหรับความคิดเห็นเกี่ยวกับการขาดการพกพา (ทำไมข้อมูลจำเพาะ POSIX จึงไม่รวมวิธีการทำเช่นนี้? grr)
Richard Hansen

3
อะไร@หมายถึงในdate -d @1234567890? man dateทำให้ไม่มีการอ้างอิงถึงที่ ...
คริสมาร์เคิล

10
@ChrisMarkle GNU หน้าคนมักจะไม่สมบูรณ์ละห้อย “รูปแบบวันที่สตริงที่มีความซับซ้อนมากขึ้นกว่าที่เป็นเอกสารได้อย่างง่ายดายนี่ แต่มีการอธิบายไว้อย่างเต็มที่ในเอกสารข้อมูล.” เพื่อปัญญา: gnu.org/software/coreutils/manual/html_node/...
กิลส์

2
info dateค่อนข้างสมบูรณ์ รายการที่28.9 Seconds since the Epochอธิบายโดยละเอียดเกี่ยวกับ @timestamp

ใน Linux ในไพพ์: date + '% s' | xargs -I n date -d @n
Ivan Ogai


14
$ echo 1190000000 | perl -pe 's/(\d+)/localtime($1)/e' 
Sun Sep 16 20:33:20 2007

สิ่งนี้มีประโยชน์สำหรับแอปพลิเคชันที่ใช้เวลาในยุคในล็อกไฟล์:

$ tail -f /var/log/nagios/nagios.log | perl -pe 's/(\d+)/localtime($1)/e'
[Thu May 13 10:15:46 2010] EXTERNAL COMMAND: PROCESS_SERVICE_CHECK_RESULT;HOSTA;check_raid;0;check_raid.pl: OK (Unit 0 on Controller 0 is OK)

11

รูปแบบที่กำหนดเองด้วย GNU date:

date -d @1234567890 +'%Y-%m-%d %H:%M:%S'

หรือกับ GNU awk:

awk 'BEGIN { print strftime("%Y-%m-%d %H:%M:%S", 1234567890); }'

คำถาม SO ที่เชื่อมโยง: https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line


3
ใช้ได้เฉพาะวันที่ของ GNU และ GNU awk เท่านั้น ทั้ง awk และ nawk สนับสนุน strftime
DarkHeart

11

มีbash-4.2หรือสูงกว่า:

printf '%(%F %T)T\n' 1234567890

( รูปแบบ -type %F %Tอยู่ที่ไหนstrftime())

ksh93ไวยากรณ์ที่เป็นแรงบันดาลใจจาก

ในksh93แต่อาร์กิวเมนต์ที่ถูกนำมาเป็นวันที่การแสดงออกที่ต่าง ๆ และรูปแบบเอกสารที่แทบจะไม่ได้รับการสนับสนุน

สำหรับเวลายุค Unix ไวยากรณ์ในksh93คือ:

printf '%(%F %T)T\n' '#1234567890'

ksh93อย่างไรก็ตามดูเหมือนว่าจะใช้อัลกอริทึมของตัวเองสำหรับเขตเวลาและอาจทำให้มันผิด ตัวอย่างเช่นในสหราชอาณาจักรเป็นเวลาฤดูร้อนตลอดทั้งปีในปี 1970 แต่:

$ TZ=Europe/London bash -c 'printf "%(%c)T\n" 0'
Thu 01 Jan 1970 01:00:00 BST
$ TZ=Europe/London ksh93 -c 'printf "%(%c)T\n" "#0"'
Thu Jan  1 00:00:00 1970

7

หากเวลายุคของคุณเป็นมิลลิวินาทีแทนที่จะเป็นวินาทีให้ลบตัวเลขสามหลักสุดท้ายก่อนที่จะผ่านไปยังdate -d:

$ date -d @1455086371603
Tue Nov  7 02:46:43 PST 48079     #Incorrect

สิ่งนี้ให้ข้อมูลที่ไม่ถูกต้อง ลบตัวเลขสามหลักสุดท้าย

$ date -d @1455086371
Tue Feb  9 22:39:31 PST 2016      #Correct after removing the last three digits. You may remove and round off the last digit too.

ยูทิลิตีใดที่พิมพ์รวมเป็นมิลลิวินาที (โดยไม่มีจุด)

ฉันได้เห็นว่าเซิร์ฟเวอร์ WebLogic Application ส่วนใหญ่ส่งคืนค่าเวลาข้อมูลด้วยมิลลิวินาทีและไม่มีจุดเมื่อใช้เครื่องมือการเขียนสคริปต์ เช่น lastSuccessfulConnectionUse = 1455086371603
KnockTurnAl

ฉันเห็น. หน้านี้ยืนยันดิบเวลาค่าการประทับเวลาในหน่วยมิลลิวินาที ขอบคุณ

เครื่องมือ Atlassian บันทึกการประทับเวลาของพวกเขาเป็นเวลายุคด้วยมิลลิวินาที
Br.Bill

6

ทั้งสองที่ฉันใช้บ่อยคือ:

$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009

และ

$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009

6

ด้วยzshคุณสามารถใช้strftimebuiltin:

strftime epochtime รูปแบบ

      ส่งออกวันที่แสดงโดยepochtimeในรูปแบบที่ระบุ

เช่น

zmodload zsh/datetime
strftime '%A, %d %b %Y' 1234567890
วันศุกร์ที่ 13 กุมภาพันธ์ 2552

นอกจากนี้ยังมีdateconvจากdateutils:

dateconv -i '%s' -f '%A, %d %b %Y' 1234567890
วันศุกร์ที่ 13 กุมภาพันธ์ 2552

โปรดจำไว้ว่าdateutilsเครื่องมือเริ่มต้นเป็นUTC(เพิ่ม-z your/timezoneหากจำเป็น)


0

คุณสามารถใช้โปรแกรม C เล็ก ๆ สำหรับการพิมพ์วันที่และเวลาในรูปแบบที่สามารถแยกวิเคราะห์โดยตรงโดยเชลล์

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(int argc, char * argv[]) {

    if (argc==1) { 
        return 1;
    }

    struct tm input_tm;
    char * formatStr  = "YEAR=%Y\nMON=%m\nDAY=%d\nHOUR=%H\nMIN=%M\nSEC=%S";
    size_t formatSize = strlen(formatStr) + 2;
    char * output     = (char *)malloc(sizeof(char)*formatSize);

    strptime(argv[1],"%s",&input_tm);
    strftime(output, formatSize, formatStr, &input_tm);

    printf("%s\n",output);
    free(output);
    return 0;
}

การใช้งาน:

#compile
clang -o epoch2datetime main.c

#invoke
eval `./epoch2datetime 1450196411`
echo $YEAR $MON $DAY $HOUR $MIN $SEC
#output
#2015 12 16 00 20 11

0

จะไม่เป็นทางออกที่แท้จริงหากไม่มี node.js เล็กน้อย:

epoch2date(){
    node -p "new Date($1)"
}

เพิ่มลงใน~/.bash_aliasesและตรวจสอบให้แน่ใจว่ามีแหล่งที่มา~/.bashrcด้วย. ~/.bash_aliases

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

ในการรับโหนดบนระบบของคุณ goto http://nvm.shและรันคำสั่ง curl มันจะติดตั้ง node version manager (nvm) ซึ่งอนุญาตให้คุณสลับเวอร์ชั่นของ node

เพียงแค่พิมพ์และเลือกรุ่นที่จะnvm ls-remotenvm install <version>


0

มีวิธีที่ง่ายกว่าในการทำสิ่งนี้: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) ToString ("s")


ยินดีต้อนรับใน U&L! โปรดดูที่แท็กของคำถาม: รหัสนี้ทำงานในบางเชลล์ในระบบ Unix หรือ Unix หรือไม่?
fra-san

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