2015-10-20 2 views
1

я не вижу какой-либо способа определить формат синтаксического анализа для date, и мой входной формат не распознается:Как преобразовать строку в DateTime в определенном формате?

dt1=`date --date="20151020T113100.475"`; echo $dt1 # fails with 'invalid date' 
+0

Что вы имеете в виду? Вы хотите указать дату в одном формате и получить ее в другом формате? –

+1

Либо «дата» понимает формат, либо нет. В зависимости от вашей системы возможности различаются. Если вам нужно больше контроля, вам нужно использовать что-то более мощное, например, встроенный модуль Perl в формате Time, Piece', который позволяет вам указать строку формата. –

+0

Да. У меня есть 2 дня в% Y% d% dT% H% M% S.% N формат. Я хочу сравнить их – ManInMoon

ответ

2

Как было предложено DevSolar, если вы Аренту делать любую другую обработку дат с этими значениями, можно просто использовать

if [[ $dt1 < $dt2 ]]; then 
    # your logic here.. 
    printf "less than..\n"; 
else 
    # your logic here.. 
    printf "greater than or equal..\n"; 
fi 

, если вам нужно преобразовать их в формате даты и/или хотите проверить строку ввода, можно использовать экстракцию Баш подстроки:

$ dt1="20151020T113100.475" 
$ date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" 
Tue Oct 20 11:31:00 AEDT 2015 

Выходные форматы могут быть применены и здесь, например:

$ date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" +"%s" 
1445301060 

здесь% s дает секунд с момента 1970-01-01 00:00:00 UTC

так, чтобы сравнить с другой даты (dt2), можно использовать что-то вроде

dt1="20151020T113100.475" 
dt2="20151021T113100.475" 
ts1=$(date -d "${dt1:0:4}-${dt1:4:2}-${dt1:6:2} ${dt1:9:2}:${dt1:11:2}:${dt1:13:6}" +"%s") 
ts2=$(date -d "${dt2:0:4}-${dt2:4:2}-${dt2:6:2} ${dt2:9:2}:${dt2:11:2}:${dt2:13:6}" +"%s") 
if ((ts1<ts2)); then 
    # your logic here.. 
    printf "less than..\n" 
else 
    # your logic here.. 
    printf "greater than or equal..\n" 
fi 

, который выводит

less than.. 

см man date для действительных выходных форматов

+1

Если все, что вы выберете, больше/равно или меньше, вы можете просто сделать 'if [[$ dt1 <$ dt2 ]] 'без предварительного преобразования ... – DevSolar

+0

да, если это единственное, что пользователь хочет делать с этой датой – amdixon

0

Как вы можете видеть, существует целый ряд различных способов подойти к этой проблеме. Как правильно отмечено, ключ находит формат date -d "string" с учетом действительной строки даты/времени. Начиная с исходной строки:

20151020T113100.475 

Один близкий формат, что дата будет принимать это:

20151020 11:31:00.475 

Получение текущей строки в новый формат, просто занимает несколько итераций удаления подстрок и кусочкам обратно вместе еще раз. Короткий сценарий, который будет работать в:

#!/bin/bash 

d="20151020T113100.475" 

dt=${d%T*}   ## 20151020 
tm=${d#*T}   ## 113100.475 
tfrac=${tm#*.}  ## 475 
tm=${tm%.$tfrac} ## 113100 

## add : between time components 
for ((i = 0; i < ${#tm}; i+=2)); do 
    nt=$nt:${tm:$i:2} 
done 
nt=${nt:1}   ## 11:31:00 
nt=${nt}.$tfrac  ## 11:31:00.475 

echo "date : '$(date -d "$dt $nt" +"%x %X (+.%N nanosecs)")'" 

exit 0 

Выход

$ bash parsedtstamp4.sh 
date : '10/20/2015 11:31:00 AM (+.475000000 nanosec)' 
Смежные вопросы