获取“日期”以理解不同语言的时间戳短语

获取“日期”以理解不同语言的时间戳短语

我的网络抓取脚本长期以来一直喜欢用来date -d读取人类格式的时间和日期戳,例如“1999 年 3 月 11 日”,并通过 -s 参数转换为我需要的任何其他格式。

我怎样才能让它理解在其他语言环境中打印的日期,27 Kwi, 13:54例如抛光?如果需要,我可以人为地添加/追加年份(2012)。

我检查了我的env并尝试了以下操作,但没有运气:

LOCALE=PL date -d "30 Kwi, 17:02"
LANGUAGE=pl_PL:pl date -d "30 Kwi, 17:02"
LC_CTYPE=pl_PL:pl date -d "30 Kwi, 17:02"
LANG=pl_PL:pl date -d "30 Kwi, 17:02"
LC_COLLATE=pl_PL:pl date -d "30 Kwi, 17:02"
LC_MESSAGES=pl_PL:pl date -d "30 Kwi, 17:02"
date: invalid date `30 Kwi, 17:02'

在我安装的系统中,

LANGUAGE=en_US:en
LC_CTYPE=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_COLLATE=en_US.UTF-8

答案1

不幸的是你不能。

GNU coreutils - 通用日期语法

在当前实现中,仅支持英语单词和缩写,例如“AM”、“DST”、“EST”、“first”、“January”、“Sunday”、“tomorrow”和“year”。


由于我找不到使用date或任何其他类似工具来完成此操作的方法,因此您可以使用以下方法在 Python 中完成此操作。

import time
import locale

locale.setlocale(locale.LC_TIME, 'pl_PL')

logtime = time.strptime('30 Kwi 2012, 17:02', '%d %b %Y, %H:%M')

您可以在任何提供它的语言中使用 strptime,例如Python,珀尔,C,红宝石, ETC。


如果您确实必须仅使用bash,请尝试以下操作:

# create an associative array, e.g. month[kwi] = 4
# requires bash >= 4
declare -A month
for m in {1..12}; do
  # any year should do since we only print the month
  mmm=$(LC_TIME=pl_PL.UTF-8 date -d "2000-$m-1" "+%b")
  month[$mmm]=$m
done

# test that the associative array works, should print 4
echo ${month[kwi]}

# given arguments <day> <month> <year>, <hour>:<minute>
# where month is a three-letter abbreviated Polish month name
# print it using the system's default date format
pl_date() {
  local d=$1
  local mmm=$2
  local yyyy=$3
  local hhmm=$4

  local m=${month[$mmm]}
  date -d "$yyyy-$m-$d $hhmm"
}

# use without quotes
pl_date 30 kwi 2012 17:02

笔记:

即使在英语中,年份也是必需的,并且不允许使用逗号:

$ date -d "30 Apr, 17:02"
date: invalid date `30 Apr, 17:02'

$ date -d "30 Apr 2012 17:02"
Mon Apr 30 17:02:00 PDT 2012

LANGUAGE支持像 之类的列表pl_PL:pl,其他变量需要单个名称,例如pl_PLpl_PL.UTF-8

相关内容