Saya mencoba menggunakan perintah tanggal untuk menghasilkan cap waktu file yang dapat ditafsirkan oleh perintah tanggal. Namun, perintah tanggal sepertinya tidak menyukai outputnya sendiri, dan saya tidak yakin bagaimana cara mengatasinya. Inti masalah:
sh-4.2$ date
Fri Jan 3 14:22:19 PST 2014
sh-4.2$ date +%Y%m%dT%H%M
20140103T1422
sh-4.2$ date -d "20140103T1422"
Thu Jan 2 23:22:00 PST 2014
tanggal tampaknya menafsirkan string dengan offset 15 jam. Apakah ada solusi yang diketahui untuk ini?
Sunting: ini bukan masalah tampilan:
sh-4.2$ date +%s
1388791096
sh-4.2$ date +%Y%m%dT%H%M
20140103T1518
sh-4.2$ date -d 20140103T1518 +%s
1388737080
sh-4.2$ python
Python 3.3.3 (default, Nov 26 2013, 13:33:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1388737080 - 1388791096
-54016
>>> 54016/3600
15.004444444444445
>>>
Ini masih mati 15 jam ketika ditampilkan sebagai cap waktu unix.
EDIT # 1
Mungkin saya harus mengajukan pertanyaan ini sedikit berbeda. Katakanlah saya memiliki daftar cap waktu dasar ISO8601 dari formulir:
- YYYYMMDDTerima kasih
- YYYYMMDDTerima kasih
Apa cara paling sederhana untuk mengubahnya menjadi cap waktu Unix yang sesuai?
Sebagai contoh:
- 20140103T1422 = 1388787720
- 20140103T142233 = 1388787753
shell-script
date
alex.forencich
sumber
sumber
20140103T1518
tidak valid ISO 8601, itu merindukan bagian zona waktuJawaban:
Anda meminta "solusi yang diketahui." Ini yang sederhana:
Ini digunakan
sed
untuk mengganti "T" dengan spasi. Hasilnya adalah format itudate
mengerti.Jika kita menambahkan detik ke tanggal ISO8601, maka
date
memerlukan lebih banyak perubahan:Di atas,
sed
menggantikan "T" dengan spasi dan juga memisahkan HHMMSS menjadi HH: MM: SS.sumber
Itu info coreutils mengatakan bahwa ISO 8601 "format diperluas" didukung.
Anda harus menambahkan tanda hubung, titik dua, dan a
+%z
untuk membuatnya bekerja.Untuk menjawab bagian kedua dari pertanyaan Anda ...
Karena format tanggal hanya berisi angka dan simbol, Anda dapat mengganti setiap simbol dengan huruf unik, misalnya menggunakan
tr
Atau Anda dapat menguraikannya menggunakan
T
dan dan-
atau+
sebagai pemisah, misalnya menggunakan shell${var%word}
dan${var#word}
ekspansiatau menggunakan
bash
pencocokan ekspresi reguleratau Perl, Python, dll.
sumber
GNU coreutils hanya mendukung tanggal ISO 8601 sebagai input sejak versi 8.13 (dirilis pada 2011-09-08). Anda harus menggunakan versi yang lebih lama.
Di bawah versi yang lebih lama, Anda perlu mengganti
T
dengan spasi. Kalau tidak, itu ditafsirkan sebagai zona waktu militer AS .Bahkan di bawah versi terbaru, hanya formulir yang diselingi sepenuhnya yang dikenali, bukan format dasar dengan hanya digit dan a
T
di tengah.sumber
Saya memang memperhatikan catatan ini di halaman manual untuk
date
.Itu tidak konklusif tetapi tidak secara eksplisit menunjukkan string format waktu yang mencakup
T
saat Anda mencoba, untuk [ISO 8601]. Sebagai ditunjukkan @Gilles , dukungan dari ISO 8601 di GNU CoreUtils relatif baru.Memformat ulang string
Anda dapat menggunakan Perl untuk memformulasi ulang string Anda.
Contoh:
Anda dapat membuat ini menangani kedua string yang termasuk detik dan yang tidak.
20140103T1422:
20140103T142233:
sumber
Menurut halaman manual tanggal, format yang Anda hasilkan tidak sama dengan apa yang
date
diharapkan sebagai input. Inilah yang dikatakan halaman manual:Jadi Anda bisa melakukannya seperti ini:
Karena dalam variabel yang digunakan untuk mendefinisikan string output,
+%m%d%H%M%Y
akan sama dengan apa yang diharapkan sebagai input.sumber