ฉันจะแปลงเวลาประทับของยุคเป็นรูปแบบที่มนุษย์อ่านได้บน cli ได้อย่างไร ฉันคิดว่ามีวิธีที่จะทำกับวันที่ แต่ไวยากรณ์ฉันพ้น (วิธีอื่น ๆ ยินดีต้อนรับ)
ฉันจะแปลงเวลาประทับของยุคเป็นรูปแบบที่มนุษย์อ่านได้บน cli ได้อย่างไร ฉันคิดว่ามีวิธีที่จะทำกับวันที่ แต่ไวยากรณ์ฉันพ้น (วิธีอื่น ๆ ยินดีต้อนรับ)
คำตอบ:
ใน * 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
@
หมายถึงในdate -d @1234567890
? man date
ทำให้ไม่มีการอ้างอิงถึงที่ ...
info date
ค่อนข้างสมบูรณ์ รายการที่28.9 Seconds since the Epoch
อธิบายโดยละเอียดเกี่ยวกับ @timestamp
$ 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)
รูปแบบที่กำหนดเองด้วย 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
มี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
หากเวลายุคของคุณเป็นมิลลิวินาทีแทนที่จะเป็นวินาทีให้ลบตัวเลขสามหลักสุดท้ายก่อนที่จะผ่านไปยัง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.
ทั้งสองที่ฉันใช้บ่อยคือ:
$ perl -leprint\ scalar\ localtime\ 1234567890
Sat Feb 14 00:31:30 2009
และ
$ tclsh
% clock format 1234567890
Sa Feb 14 00:31:30 CET 2009
ด้วยzsh
คุณสามารถใช้strftime
builtin:
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
หากจำเป็น)
คุณสามารถใช้โปรแกรม 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
จะไม่เป็นทางออกที่แท้จริงหากไม่มี 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-remote
nvm install <version>
มีวิธีที่ง่ายกว่าในการทำสิ่งนี้: (([System.DateTimeOffset] :: FromUnixTimeMilliSeconds ($ unixtime)). DateTime) ToString ("s")