簡體   English   中英

如何將特定格式的字符串轉換為DateTime?

[英]How can I convert a string to DateTime with specific format?

我看不到為date指定解析格式的任何方法,並且無法識別我的輸入格式:

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

根據DevSolar的建議,如果您不打算使用這些值進行任何其他日期處理,則可以使用

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

如果您需要將它們轉換為日期格式和/或要驗證字符串輸入,可以使用bash子字符串提取:

$ 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年1月1日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..

查看有效的輸出格式的制造商日期

如您所見,有多種方法可以解決此問題。 正確地指出,關鍵是要考慮到有效的日期/時間字符串來找到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)'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM