linux bash – 自定义格式的parsingdate

我有一个%c格式的date(可以是任何其他) ,我需要在date命令中使用它。 %c不是美国的格式。 这是德国的,因为它是德国的服务器。 这在美国服务器上也不能正常工作。 (设置为德语或美语的语言环境)

这不起作用(包括错误):

 user@server:~$ NOW=$(date +%c); echo $NOW Do 19 Dez 2013 22:33:28 CET user@server:~$ date --date="$NOW" +%d/%m/%Y date: ungültiges Datum „Do 19 Dez 2013 22:33:28 CET“ 

(date:ungültigesDatum“Do 19 Dez 2013 22:33:28 CET”= date: invalid date „Do 19 Dez 2013 22:33:28 CET“

难点在于我不知道以后会使用哪种语言环境,甚至是什么格式,因为用户可以设置自己的格式。 所以一个简单的具体的parsing解决scheme并不是真正的工作!

但我该怎么做呢?

为了处理这个问题:

如果我有一个date格式format1 (可以是任何或至less一个可以颠倒),我可以使用date来获得格式化的date。 但是,如果我想格式化到另一个date( format2 ),我该怎么做呢?
任何使用除coreutil以外的任何解决scheme都是毫无意义的,因为我正在尝试为尽可能多的unix机器开发一个bash脚本。

 DATE=$(date "+$format1") date --date="$DATE" "+$format2" # Error in most cases! 

这是需要的,因为我有一个用户可以给date格式的命令。 这个datestring将被显示。 但在后面的步骤中,我需要将此datestring转换为另一个固定的string。 我可以操作命令将得到的格式,并且可以控制输出(或用户将看到的内容)
我无法两次运行该命令,因为这非常耗时。


更新:

我发现了一些解决scheme:

 # Modify $user_format so it can be parsed later user_format="$user_format %s" # Time consuming command which will print a date in the given format output=$(time_consuming_command params "$user_format" more params) # This will only display what $user_format used to be echo ${output% *} # A simple unix timestamp parsing ("${output##* }" will only return the timestamp) new_formated_date=$(date -d "1970-01-01 ${output##* } sec UTC" "+$new_format") 

这是行之有效的,可能对别人有帮助。 所以我会和你分享一下

Solutions Collecting From Web of "linux bash – 自定义格式的parsingdate"

为什么不把时间存储为unixtime(即1970年1月1日以来的毫秒)如1388198714

所要求的试图将所有来自世界各地的日期格式解析为一个没有合理依赖性的一击bash脚本是有点荒谬的。

在GNU coreutils 8.22中不可能使用。 从日期手册:

'-d datestr'

'–date = datestr'

显示在datestr中指定的日期和时间,而不是当前的日期和时间。 datestr可以是几乎任何常见的格式。 它可以包含月份名称,时区,“am”和“pm”,“昨天”等。例如,–date =“2004-02-27 14:19:13.489392193 +0530”指定时间在UTC时间之后5小时30分的时区,在2004年2月27日下午2:19:13之后是489,392,193纳秒。

注意:输入当前必须是区域独立的格式。 例如,下面的LC_TIME = C需要在许多地区打印回正确的日期:

 date -d "$(LC_TIME=C date)" 

http://www.gnu.org/software/coreutils/manual/html_node/Options-for-date.html#Options-for-date

请注意,输入格式不能使用特定于语言环境的格式。

可能有其他的库或程序可以识别更多的日期格式,但对于给定的日期格式,编写一个简短的程序将其转换为日期识别(例如,使用Perl或awk)并不困难。

你可以使用libdatetime-format-flexible-perl

 #!/usr/bin/perl use DateTime::Format::Flexible; my $date_str = "So 22 Dez 2013 07:29:35 CET"; $parser = DateTime::Format::Flexible->new; my $date = $parser->parse_datetime($date_str); print $date 

默认的输出是2013-12-22T07:29:35 ,但是由于$date不是一个普通的字符串,而是一个对象,所以你可以这样做:

 printf '%02d.%02d.%d', $date->day, $date->month, $date->year; 

另外date行为可能应该被视为一个错误。 我这样认为,因为在相同的格式,但在俄罗斯的日期被正确解析。

 $ export LC_TIME=ru_RU.UTF-8 $ NOW="$(date "+%c")" $ date --date="$NOW" '+%d.%m.%Y' 22.12.2013 

如果你的意思是格式错误,我你想要的是:

 NOW=$(date +%c) date --date="$NOW" +%d/%m/%Y 

请注意小写的%d%m

本地,这是我得到的:

 root@server2:~# NOW=$(date +%c) root@server2:~# date --date="$NOW" +%d/%m/%Y 19/12/2013