web-dev-qa-db-ja.com

「日付」を取得して、別の言語のタイムスタンプフレーズを理解する

私のWebスクレイピングスクリプトは、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
5
Marcos

残念ながらできません。

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は、それを提供する任意の言語で使用できます。 PythonPerl[〜#〜] c [〜#〜]Ruby など。


本当に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_PLまたはpl_PL.UTF-8

6
Mikel