String waktu tanggal dalam format berikut: 06/12/2012 07:21:22. Bagaimana cara mengubahnya menjadi stempel waktu UNIX atau epoch?
95
Apa yang Anda cari adalah date --date='06/12/2012 07:21:22' +"%s"
. Ingatlah bahwa ini mengasumsikan Anda menggunakan GNU coreutils, karena keduanya --date
dan %s
string formatnya adalah ekstensi GNU. POSIX tidak menentukan salah satu dari itu, jadi tidak ada cara portabel untuk membuat konversi seperti itu bahkan pada sistem yang sesuai dengan POSIX.
Lihat halaman manual yang sesuai untuk versi lain date
.
Catatan: bash --date
dan -d
opsi mengharapkan tanggal dalam format AS atau ISO8601, yaitu mm/dd/yyyy
atau yyyy-mm-dd
, bukan di Inggris Raya, UE, atau format lainnya.
+"%s"
adalah singkatan dari format output dan%s
merupakan format waktu dalam hitungan detik sejak 1970date --date='06/12/2012 07:21:22 -0000' +"%s"
yyyy-mm-dd hh:mm:ss
lihat di gnu.org/software/coreutils/manual/html_node/… :gdate --date='2019-06-18 00:02:00 +0000' +%s
Untuk Linux Jalankan perintah ini
date -d '06/12/2012 07:21:22' +"%s"
Untuk mac OSX, jalankan perintah ini
date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"
sumber
-u
bendera harus memperbaikinya.-u
bendera harus datang sebelum para-f
bendera, atau yang lain yang menafsirkan shell itu format string. Jadi, seharusnya:date -j -u -f "%a..."
date -jf "%Y-%m-%d %H:%M:%S" "2018-01-08 14:45:00" +%s
Banyak dari jawaban ini terlalu rumit dan juga tidak ada cara menggunakan variabel. Beginilah cara Anda melakukannya dengan lebih sederhana pada sistem Linux standar (seperti yang disebutkan sebelumnya, perintah tanggal harus disesuaikan untuk Pengguna Mac):
Contoh skrip:
#!/bin/bash orig="Apr 28 07:50:01" epoch=$(date -d "${orig}" +"%s") epoch_to_date=$(date -d @$epoch +%Y%m%d_%H%M%S) echo "RESULTS:" echo "original = $orig" echo "epoch conv = $epoch" echo "epoch to human readable time stamp = $epoch_to_date"
Hasil dalam:
Atau sebagai fungsi:
# -- Converts from human to epoch or epoch to human, specifically "Apr 28 07:50:01" human. # typeset now=$(date +"%s") # typeset now_human_date=$(convert_cron_time "human" "$now") function convert_cron_time() { case "${1,,}" in epoch) # human to epoch (eg. "Apr 28 07:50:01" to 1524916201) echo $(date -d "${2}" +"%s") ;; human) # epoch to human (eg. 1524916201 to "Apr 28 07:50:01") echo $(date -d "@${2}" +"%b %d %H:%M:%S") ;; esac }
sumber
get_curr_date () { # get unix time DATE=$(date +%s) echo "DATE_CURR : "$DATE } conv_utime_hread () { # convert unix time to human readable format DATE_HREAD=$(date -d @$DATE +%Y%m%d_%H%M%S) echo "DATE_HREAD : "$DATE_HREAD }
sumber
Solusi yang efisien digunakan
date
sebagai proses khusus latar belakangUntuk membuat terjemahan semacam ini lebih cepat ...
Intro
Di posting ini, Anda akan menemukan
bc
,rot13
,sed
...).Demo Cepat
fifo=$HOME/.fifoDate-$$ mkfifo $fifo exec 5> >(exec stdbuf -o0 date -f - +%s >$fifo 2>&1) echo now 1>&5 exec 6< $fifo rm $fifo read -t 1 -u 6 now echo $now
Ini harus mengeluarkan UNIXTIME saat ini . Dari sana, Anda bisa membandingkan
time for i in {1..5000};do echo >&5 "now" ; read -t 1 -u6 ans;done real 0m0.298s user 0m0.132s sys 0m0.096s
dan:
time for i in {1..5000};do ans=$(date +%s -d "now");done real 0m6.826s user 0m0.256s sys 0m1.364s
Dari lebih dari 6 detik menjadi kurang dari setengah detik !! (pada tuan rumah saya).
Anda dapat memeriksa
echo $ans
, mengganti"now"
dengan"2019-25-12 20:10:00"
dan seterusnya ...Opsional, Anda bisa, setelah persyaratan subproses tanggal berakhir:
exec 5>&- ; exec 6<&-
Posting asli (penjelasan rinci)
Alih-alih menjalankan 1 percabangan berdasarkan tanggal untuk mengonversi, jalankan
date
hanya 1 kali dan lakukan semua konversi dengan proses yang sama (ini bisa menjadi jauh lebih cepat) !:Sampel:
start1=$(LANG=C ps ho lstart 1) start2=$(LANG=C ps ho lstart $$) dirchg=$(LANG=C date -r .) read -p "A date: " userdate { read start1 ; read start2 ; read dirchg ; read userdate ;} < <( date -f - +%s <<<"$start1"$'\n'"$start2"$'\n'"$dirchg"$'\n'"$userdate" )
Kemudian sekarang lihat:
declare -p start1 start2 dirchg userdate
Ini dilakukan dalam satu eksekusi!
Menggunakan subproses yang berjalan lama
Kami hanya membutuhkan satu fifo :
mkfifo /tmp/myDateFifo exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo) exec 8</tmp/myDateFifo rm /tmp/myDateFifo
(Catatan: Saat proses sedang berjalan dan semua deskriptor dibuka, kami dapat dengan aman menghapus entri sistem file fifo.)
Kemudian sekarang:
LANG=C ps ho lstart 1 $$ >&7 read -u 8 start1 read -u 8 start2 LANG=C date -r . >&7 read -u 8 dirchg read -p "Some date: " userdate echo >&7 $userdate read -u 8 userdate
Kita bisa membangun sedikit fungsi:
mydate() { local var=$1; shift; echo >&7 $@ read -u 8 $var } mydate start1 $(LANG=C ps ho lstart 1) echo $start1
Atau gunakan fungsi saya
newConnector
Dengan fungsi untuk menghubungkan
MySQL/MariaDB
,PostgreSQL
danSQLite
...Anda dapat menemukannya dalam versi yang berbeda di GitHub , atau di situs saya: unduh atau tampilkan .
wget https://raw.githubusercontent.com/F-Hauri/Connector-bash/master/shell_connector.bash . shell_connector.bash newConnector /bin/date '-f - +%s' @0 0 myDate "2018-1-1 12:00" test echo $test 1514804400
Catatan: Di GitHub , fungsi dan pengujian adalah file yang terpisah. Di situs saya, pengujian dijalankan hanya jika skrip ini tidak bersumber .
# Exit here if script is sourced [ "$0" = "$BASH_SOURCE" ] || { true;return 0;}
sumber
Pastikan saja zona waktu yang ingin Anda gunakan.
datetime="06/12/2012 07:21:22"
Penggunaan paling populer membutuhkan zona waktu mesin.
date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882"
Tetapi jika Anda dengan sengaja ingin melewati waktu UTC dan Anda ingin zona waktu yang tepat, Anda perlu menambahkan
-u
bendera. Jika tidak, Anda mengubahnya dari zona waktu lokal Anda.date -u -d "$datetime" +"%s" #general output = "1339485682"
sumber
date
memformat input ini dengan benar.