タイムスタンプ形式にはあまり詳しくありません。
たとえば、テキストがあります
'Jul 19, 2013 12:00 pm'
mysqlに保存したいです。MySQL でのこのタイムスタンプの形式と、mysql に渡す前に perl で適切にフォーマットする方法を教えてください。
ありがとう。
MySQLのマニュアルを読むことを強くお勧めします。StackOverflow に質問を投稿するよりもはるかに早く回答を得ることができます。ドキュメントから:
TIMESTAMP の範囲は、「1970-01-01 00:00:01」UTC から「2038-01-19 03:14:07」UTC です。
ご覧のとおり、フォーマットはYYYY-MM-DD HH:MM:SS
.
ysthがコメントで指摘しているように、MySQL には次のDATETIME
データ型もあります。
MySQL は、DATETIME 値を「YYYY-MM-DD HH:MM:SS」形式で取得して表示します。サポートされている範囲は「1000-01-01 00:00:00」から「9999-12-31 23:59:59」です。
注意すべき点がいくつかあります。
DATETIME
TIMESTAMP
どちらもフォーマットを使用しますYYYY-MM-DD HH:MM:SS
DATETIME
でサポートされている日付の範囲は、TIMESTAMP
TIMESTAMP
保存のために値を UTC に変換し、取得時にローカル タイム ゾーンに戻します。DATETIME
タイムゾーン変換を行いませんデータ型にまだ慣れていない場合は、保存しようとしているデータの種類に応じて、代わりにTIMESTAMP
使用することを検討してください。vs.の詳細については、この StackOverflow の質問DATETIME
を参照してください。DATETIME
TIMESTAMP
Perl で日付/時刻文字列を別の形式に変換するには、コア (v5.9 以降) モジュールTime::Pieceを使用できます。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Time::Piece;
my $date = 'Jul 19, 2013 12:00 pm';
my $t = Time::Piece->strptime($date, '%b %d, %Y %I:%M %p');
say $t->strftime('%F %T');
# 2013-07-19 12:00:00
日付文字列の例から、日と時間がゼロで埋められているかどうかは明らかではありません。上記の例は、次のような形式を想定しています
2013 年10月1 日05:00午前
ここで、10 未満の曜日と時間はゼロで始まります。入力形式が実際に
2013 年10 月1日 午前5時
に渡されるフォーマット文字列を変更する必要がありますTime::Piece->strptime
。フォーマット指定子のリストは、 strftime の man ページにあります。