Що таке стандартна команда для друку дати у форматі RFC-3339?


19

dateКоманда не пропонує таку річ, яка є свого роду сумно , так як RFC-3339 є сучасним, широко поширений, нормальний формат , який використовується у всьому світі ( за винятком електронної пошти , який НЕ є ні сучасним , жодна розсудлива).

Моє зміщення часового поясу наразі -08: 00, тому найпростіша форма цієї команди повинна друкувати поточний час як 2013-09-05T14:58:33.102-08:00.


Який стандарт (и) вас цікавить?
Стефан Шазелас

Я особисто добре з GNU, але в грандіозній схемі речей це дійсно повинно бути ширшим за це. Він також повинен мати розумний дефолт (короткий варіант, точність в мілісекундах) і мати можливість вказати підсекундну точність (кількість цифр, крім 0 або 9).
Мартін Джамбон

1
Це не розумний формат: повна відсутність пробілів робить людину надмірно важкою для читання. Ви повинні використовувати незначні зміни, 2013-09-05 14:58:33.102 -0800за винятком випадків, коли пробіли взагалі не повинні використовуватися.
zwol

1
Я порівнював його з форматом дати пошти (RFC 822, 2822), який важко читати і для людей, і для машин.
Мартін Джамбон

Відповіді:


30

Схоже , що ви можете зробити кілька форматів , використовуючи перемикач для реалізації ГНУ date(версії 5.90 або вище), --rfc3339=.

Приклади

$ date --rfc-3339=date
2014-03-19

$ date --rfc-3339=seconds
2014-03-19 18:00:05-04:00

$ date --rfc-3339=ns
2014-03-19 18:00:08.179780629-04:00

Якщо ви хочете, Tщоб це було додано, як хак:

$ date --rfc-3339=seconds | sed 's/ /T/'
2014-03-19T18:35:03-04:00

Якщо ви хочете це в мілісекундах:

$ date --rfc-3339=ns | sed 's/ /T/; s/\(\....\).*\([+-]\)/\1\2/g'
2014-03-19T18:42:52.362-04:00

Список літератури


7
У наші дні жодного злому не потрібно, щоб отримати "T". --iso-8601' option accepts the same arguments as --Rfc-3339`, і включає в себе «T» в його виході.
Ti Strga

1
Частина седу s/\(\....\).*-/\1-/gповинна s/\(\....\).*\([+-]\)/\1\2/gтакож працювати на схід від Атлантики.
svante

1
@svante - дякую за деталі, виправлено.
slm

2
@Eonil, що насправді невірно, RFC3339 зазначає: NOTE: ISO 8601 defines date and time separated by "T".Хоча RFC3339 дозволяє використовувати пробіл замість цього. Прочитайте ietf.org/rfc/rfc3339.txt Розділ 5.6
rwenz3l

1
@ rwenz3l Моя вина. Я просто прочитав лише частину ABNF і пропустив нотатки. Дякуємо, що вказали на це!
Еоніл

18

З GNU date(5,90 або вище):

$ TZ=America/Anchorage date '+%FT%T.%N%:z'
2014-03-19T14:29:31.041119357-08:00

Замінити %Nз %3Nдля мілісекунд, в %6Nпротягом мікросекунд ...

AFAIK, жодна зі специфікацій POSIX, Unix або LSB не вказує жодної команди, яка може відображати рази з подробицею деталізації, але дробова частина є необов'язковою в RFC 3339.

POSIX / Unix / LSB підтримує обрив %zдля відображення зміщення TZ як -0800, тому найбільш портативний, який ви, мабуть, збираєтесь отримати:

 $ TZ=America/Anchorage perl -MPOSIX -le '$t = strftime "%Y-%m-%dT%T%z",
   localtime; $t =~ s/..$/:$&/; print $t'
 2014-03-19T14:30:23-08:00

8

У GNU dateвбудований формат ISO-8601 - хіба це не зовсім близько чи навіть ідентично до RFC-3339?

1065 % date --iso-8601=seconds
2014-03-19T16:51:16-0600

ISO-8601 дозволяє різне форматування дат і часу, але я думаю, що ОП запитує спеціально для формату дати W3C "Повна дата плюс години, хвилини, секунди і десяткова частка секунди РРРР-ММ-DDThh: мм: ss.sTZD (наприклад, 1997-07-16T19: 20: 30,45 + 01: 00) " - формати дати та часу W3C .
hakre

8

Як щодо доброго старого:

$ date +%Y-%m-%dT%T%z
2015-10-29T14:47:06+0200

Де інформація про часовий пояс?
Рафаель Аренс

Це працює як на mac, так і на linux 'date'
Eran Chetzroni

1
Як щодо мілісекунд?
Мартін Джамбон

6
швидка примітка тут, не відкриваючи RFC, сегмент часового поясу, 0200відсутня двокрапка, що може порушити деякі системи, які цього вимагають.
Майк Макінтош

2
@ Примітка MikeMackintosh доречна; Виведений тут результат не є законною датою RFC 3339. Товста кишка в сегменті часового поясу потрібна для RFC 3339; див. визначення time-numoffsetна tools.ietf.org/html/rfc3339#section-5.6 .
Марк Амері

7

Ви також можете проформатувати час відповідно до RFC3339 (ISO8601) :

$ date -u +"%Y-%m-%dT%H:%M:%SZ"
2016-11-08T08:52:55Z

ПРИМІТКА. Цей формат також використовується в Конвенції про схему міток RC 1.0


Це не є дійсним RFC3339. Відповідь Ірана на `` `дату +% ​​Y-% m-% dT% T% z` `` правильна і менше символів. Якщо ви хочете в UTC пропустити прапор -u, який скасуватиме зміщення часового поясу.
бричебург

З -uпрапором ця відповідь правильна, правда?
Лассі

0
echo "Local date only:"
date '+%Y-%m-%d'
echo
echo "Local date and time:"
date '+%Y-%m-%dT%H:%M:%S%z' | sed 's@^.\{22\}@&:@'
echo
echo "UTC date and time:"
date -u '+%Y-%m-%dT%H:%M:%SZ'

Ці команди сумісні з POSIX, за винятком %zспецифікації перетворення. Однак %zшироко підтримується і працює так само в Linux, MacOS, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, Solaris, Minix та Haiku. Він також працює з інструментами в Busybox, Toybox та sbase (утиліти базової системи suckless.org). Оскільки %zвиводить зміщення часового поясу у ±HHMMформаті, нам потрібна sedтруба, щоб додати двокрапку та змінити її ±HH:MM.

ПРИМІТКА. Команда проекту Heirloom dateмає несумісний %zвихід: він не друкує +знак.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.