将时间格式从 2020 年 2 月 5 日 01:55 pm 转换为 2020-02-05 13:55:00 的最佳方法 [重复]

Posted

技术标签:

【中文标题】将时间格式从 2020 年 2 月 5 日 01:55 pm 转换为 2020-02-05 13:55:00 的最佳方法 [重复]【英文标题】:Best way to convert time format from Feb 05 2020 01:55 pm to 2020-02-05 13:55:00 [duplicate] 【发布时间】:2020-12-22 00:07:39 【问题描述】:

转换此日期时间形式的最佳方法是什么:

Feb 05 2020   09:26 am
Feb 05 2020   01:55 pm

进入

2020-02-05 09:26:00
2020-02-05 13:55:00

我知道我可以使用 sed 在更改为 2020-02-05 格式的那一天进行迭代。 我可以使用:

echo "01:55 pm" | sed -e 's/01:\([0-9]\+\) pm/13:\1:00/g'

对文件进行不同时间的迭代。

这是最好的处理方式吗? 如果它更干净,我愿意使用 python 或其他方法。

【问题讨论】:

【参考方案1】:

您能否尝试使用所示示例进行以下、编写和测试。

awk '
BEGIN
  FS="[ :]"
  num=split("jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec",arr,",")
  for(i=1;i<=num;i++)
    month[arr[i]]=i
  


  printf("%d-%02d-%02d %02d:%02d:00\n",$3,month[tolower($1)],$2,$(NF-2)+$NF=="pm" && $(NF-2)<12 ? 12 : 0 ),$(NF-1))
'  Input_file

说明:为上述解决方案添加详细说明。

awk '                            ##Starting awk program from here.
BEGIN                           ##Starting BEGIN section of this program from here.
  FS="[ :]"                      ##Setting field separator as space and colon here.
  num=split("jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec",arr,",")   ##Creating array arr which has all months names in it.
  for(i=1;i<=num;i++)           ##Starting for loop from 1 to till value of arr length here.
    month[arr[i]]=i              ##Creating month array with index of value of arr with index i and its value is variable i.
  


  printf("%d-%02d-%02d %02d:%02d:00\n",$3,month[tolower($1)],$2,$(NF-2)+($NF=="pm" && $(NF-2)<12 ? 12 : 0 ),$(NF-1))   ##Printing 3rd field, month value with first field as index, 2nd field, 2nd last field and adding 12 if last field is pm else do not add anything.
' 

【讨论】:

【参考方案2】:

您必须使用例如模块datetime 和函数strptime。 你应该检查strptime的Python参考:

类方法datetime.strptime(date_string, format)

返回一个date_string对应的日期时间,根据格式解析。

from datetime import datetime
str1 = 'Feb 05 2020   09:26 am'
str2 = 'Feb 05 2020   01:55 pm'

date_1 = datetime.strptime(str1, "%b %d %Y    %I:%M %p")
date_2 = datetime.strptime(str2, "%b %d %Y    %I:%M %p")

print("date =", date_1)
print("date =", date_2)

结果:

date = 2020-02-05 09:26:00
date = 2020-02-05 13:55:00

【讨论】:

感谢所有可能的解决方案。我最终选择了 Python 版本,因为它可以更好地帮助我前进。【参考方案3】:

您可以使用datetime中的转换函数(见format codes):

import datetime

in_format = '%b %d %Y   %I:%M %p'
out_format = '%Y-%m-%d %H:%M:%S'
value = 'Feb 05 2020   01:55 pm'

print(datetime.datetime.strptime(value, in_format).strftime(out_format))

给予:

2020-02-05 13:55:00

【讨论】:

【参考方案4】:

使用内置函数将字符串解析为日期时间对象:

from datetime import datetime

s = 'Feb 05 2020   09:26 am'
d = datetime.strptime(s, '%b %d %Y   %I:%M %p')
print(d)
print(type(d))

将打印

2020-02-05 09:26:00
<class 'datetime.datetime'>

【讨论】:

您正在使用%H。我相信尽管使用了 %p 这会给 pm 提供错误的答案 - 12 小时制的 %I 应与 %p 结合使用。 正确。将删除此帖子,因为您的回答已经涵盖此内容 如您所愿,但您的答案有一个有趣的观察结果,即输出格式只是 datetime 对象的常用字符串表示(实际上不需要 strftime 输出),所以值得更正并保留它,因为我错过了这个事实。 好的,我已更正它以不提供错误答案 好。我认为保留这两个答案是值得的,以便 OP 可以看到 strftime 在这里实际上不是必需的,但是如果需要稍微不同的输出格式,如何使用它。

以上是关于将时间格式从 2020 年 2 月 5 日 01:55 pm 转换为 2020-02-05 13:55:00 的最佳方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

2020年01月30日

Format String Vulnerability Lab(格式化字符串漏洞实验最新版——2020年1月12日更新)

确定字符串格式是“2013 年 5 月 16 日”还是带有 Javascript 的 UNIX 时间戳

python如何求2020年第19周起止日期: 2020年第19周(5月4日-5月10日)?

检查渐变维度 2

SQL怎么把日期格式1990-01-01转换成1990年1月1日?