Próbuję użyć polecenia date, aby wygenerować znacznik czasu pliku, który samo polecenie date może zinterpretować. Wydaje się jednak, że komenda date nie lubi własnych wyników i nie jestem pewien, jak to obejść. Przykładem:
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
data wydaje się interpretować ciąg z przesunięciem 15 godzin. Czy istnieją jakieś znane obejścia tego problemu?
Edycja: to nie jest problem z wyświetlaniem:
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
>>>
Nadal jest wyłączony o 15 godzin, gdy jest wyświetlany jako znacznik czasu unix.
EDYCJA 1
Może powinienem postawić to pytanie nieco inaczej. Powiedzmy, że mam listę podstawowych znaczników czasu ISO8601 formularza:
- RRRRMMDDGmm
- RRRRMMDDGgmmmm
Jaki jest najprostszy sposób przekonwertowania ich na odpowiednie znaczniki czasu Unix?
Na przykład:
- 20140103T1422 = 1388787720
- 20140103T142233 = 1388787753
shell-script
date
alex.forencich
źródło
źródło
20140103T1518
nie jest zgodny z ISO 8601, brakuje części strefy czasowejOdpowiedzi:
Pytasz o „znane obejścia”. Oto prosty:
Służy
sed
do zastąpienia litery „T” spacją. Rezultatem jest format, którydate
rozumie.Jeśli dodamy sekundy do daty ISO8601,
date
wymaga to dalszych zmian:Powyżej
sed
zastępuje „T” spacją, a także dzieli HHMMSS na HH: MM: SS.źródło
Dokumenty Coreutils informują, że obsługiwany jest „rozszerzony format” ISO 8601.
Musisz dodać łączniki, dwukropki i a,
+%z
aby to działało.Aby odpowiedzieć na drugą część pytania ...
Ponieważ format daty zawiera tylko cyfry i symbole, każdy symbol można zastąpić unikalną literą, np. Używając
tr
Możesz też parsować go za pomocą
T
i-
oraz+
jako separatorów, np. Używając powłoki${var%word}
i${var#word}
rozszerzenialub używając
bash
dopasowania wyrażeń regularnychlub Perl, Python itp. itd.
źródło
Coreutils GNU obsługuje tylko daty ISO 8601 jako dane wejściowe od wersji 8.13 (wydanej 08.08.2011). Musisz używać starszej wersji.
W starszych wersjach należy zastąpić
T
spacją. W przeciwnym razie jest to interpretowane jako amerykańska wojskowa strefa czasowa .Nawet w najnowszych wersjach rozpoznawana jest tylko w pełni interpunkcyjna forma, a nie podstawowy format zawierający tylko cyfry i
T
środek.źródło
Zauważyłem tę notatkę na stronie podręcznika dla
date
.Nie jest to rozstrzygające, ale nie pokazuje jawnie ciągu formatu czasu, który zawiera
T
próbę, dla [ISO 8601]. Jak wskazała odpowiedź @Gilles , obsługa ISO 8601 w GNU CoreUtils jest stosunkowo nowa.Ponowne formatowanie ciągu
Możesz użyć Perla do przeformułowania łańcucha.
Przykład:
Możesz ustawić tę obsługę zarówno ciągów zawierających sekundy, jak i tych, które tego nie robią.
20140103T1422:
20140103T142233:
źródło
Według strony podręcznika daty format, który wyprowadzasz, nie jest taki sam, jak
date
oczekiwany jako dane wejściowe. Oto, co mówi strona podręcznika:Możesz to zrobić w ten sposób:
Ponieważ w zmiennych, które są używane do zdefiniowania ciągu wyjściowego,
+%m%d%H%M%Y
byłby równy temu, czego oczekuje jako dane wejściowe.źródło