質問

今現在使用し、第3者のAPIを提供するdatetimeを次の形式:

Sat Mar 06 09:00:00 ICST 2010
Fri Feb 19 19:30:00 JDT 2010
Fri Feb 19 19:30:00 PST 2010

しかし、格納したいこれらのdatetimeオブジェMySQLは標準datetimeの分野を必要とする以下のフォーマット:

YYYY-MM-DD HH:MM:SS

に関しては、まさに今、次のコードする報告の誤り特定のタイムゾーンなどのKDT,JDT、ICST:

use Date::Manip;
use DateTime;
use DateTime::Format::DateManip;

my $date = ParseDate($time);
$date = DateTime::Format::DateManip->parse_datetime($date);
eval{ $time = $date->strftime("%Y-%m-%d %H:%M:%S"); };

ですがおすすめのより良い実施のPerl上記コードに変換するdatetimeオブジェからのAPIの適切な形式、時間をサーバからインターネットに挿入されるMySQLのdatetimeす。

おかげさまで、予めご&アドバイス!

役に立ちましたか?

解決

GMTで内部時刻を保管してください。 GMTのすべての操作を行います。その後、ユーザーに結果を表示しようとしているだけのように最後の瞬間、の後、ので、ユーザーのローカル時間に変換します。

私は日:: を解析しますが、あなたの使用をお勧めしますそれは現在、インドシナサマータイムと日本標準時を持っていないので、「は、例えば、そのタイムゾーンオフセットを強化する必要があるでしょう。

#! /usr/bin/perl

use warnings;
use strict;

use Date::Format;
use Date::Parse;

# add timezone offsets
$Time::Zone::Zone{icst} = +7*3600;
$Time::Zone::Zone{jdt}  = +9*3600;

while (<DATA>) {
  chomp;
  warn("$0: failed conversion for $_\n"), next
    unless defined(my $time_t = str2time $_);

  my @t = gmtime($time_t);
  print $_, " => ", strftime("%Y-%m-%d %H:%M:%S", @t), "\n";
}

__DATA__
Sat Mar 06 09:00:00 ICST 2010
Fri Feb 19 19:30:00 JDT 2010
Fri Feb 19 19:30:00 PST 2010

出力:

Sat Mar 06 09:00:00 ICST 2010 => 2010-03-06 02:00:00
Fri Feb 19 19:30:00 JDT 2010 => 2010-02-19 10:30:00
Fri Feb 19 19:30:00 PST 2010 => 2010-02-20 03:30:00

あなたが好きなクエリをサポートするために、GMTの時間プラスを格納したオフセット(のすなわち。の、APIからの現地時間にGMTから)。以下のコードはstr2timeが所定時間を解析することができれば、strptimeもできることを想定しています。

にループを変更
my @dates;
while (<DATA>) {
  chomp;
  warn("$0: failed conversion for $_\n"), next
    unless defined(my $time_t = str2time $_);

  my $zone = (strptime $_)[-1];
  my @t = gmtime($time_t);
  push @dates => [ strftime("%Y-%m-%d %H:%M:%S", @t)
                 , sprintf("%+03d:%02d",
                           int($zone / 3600),
                           int($zone % 3600) / 60)
                 , $_
                 ];
}

収集時間で、SQLとしてレンダリングます:

print "DROP TABLE IF EXISTS dates;\n",
      "CREATE TABLE dates (date DATETIME, offset CHAR(6));\n",
      "INSERT INTO dates (date,offset) VALUES\n",
        join(",\n\n" =>
          map("  -- $_->[2]\n" .
              "  ('$_->[0]','$_->[1]')", @dates)),
        ";\n",
      "SELECT CONVERT_TZ(date,'+00:00',offset) FROM dates;\n"

が出力される

DROP TABLE IF EXISTS dates;
CREATE TABLE dates (date DATETIME, offset CHAR(6));
INSERT INTO dates (date,offset) VALUES
  -- Sat Mar 06 09:00:00 ICST 2010
  ('2010-03-06 02:00:00','+07:00'),

  -- Fri Feb 19 19:30:00 JDT 2010
  ('2010-02-19 10:30:00','+09:00'),

  -- Fri Feb 19 19:30:00 PST 2010
  ('2010-02-20 03:30:00','-08:00');
SELECT CONVERT_TZ(date,'+00:00',offset) FROM dates;

私たちはパイプそれはmysqlすることができます:

$ ./prog.pl | mysql -u username -D dbname
CONVERT_TZ(date,'+00:00',offset)
2010-03-06 09:00:00
2010-02-19 19:30:00
2010-02-19 19:30:00

他のヒント

日付を格納するとき、あなたは常にUTCに保管しなければなりません。そうすれば、あなたがデータベースからそれらを取得し、ユーザに表示するために、必要に応じて適切なタイムゾーンに変換することができます。

はPerlで適切に日付時刻を扱うために、私は心からのパーサーを有し、のDateTime のスイートをお勧めしますそして、様々な入出力フォーマットのすべての種類のためのフォーマッタ。

私はあなたのOPにリストされている日付は、標準的なフォーマットであればわからないんだけど、いない場合、彼らからのDateTime書式を構築するために非常に簡単になります:

my $str = 'Sat Mar 06 09:00:00 ICST 2010';
my ( $month, $day, $hour, $min, $sec, $tz, $year ) = ( $str =~ m{\w{3}\s(\w{3})\s(\d{2})\s(\d{2}):(\d{2}):(\d{2})\s(\w+)\s(\d{4})} );

my $dt = DateTime->new( year => $year, month => $month, day => $day, 
                        hour => $hour, minute => $min, second => $sec, 
                        time_zone => $tz );

これで、のDateTime ::フォーマット:: MySQLのに使用することができますMySQLの互換日時に日付を変換します。

おそらくして明示的に伝えるDateTimeのコンストラクタをタイムゾーン(s)をお持ちでは、文字コードはない独自の標準化されていません。

私はあなたが始まる 日時::タイムゾーン, して、新しい種類のおタイムゾーンが見つからない場合は何かを探している。アルバイトを探す際、DateTimeフォーマッタに準じたお書式があり膨大な数)の対応が難しいことではないけれど、単純に使用regexの抽出日時分野に渡ることにしたDateTimeのコンストラクタ.

お客さま人数小児-幼児にただの文字列を構文解析へのDateTimeオブジェクトに正しく設定されていますので、全く問題なしに変換して出MySQLタイムスタンプ:使おう 日時::フォーマット::MySQL:

my $string = DateTime::Format::MySQL->format_datetime($dt);

href="http://search.cpan.org/dist/DateTime/" rel="nofollow noreferrer">のDateTime のモジュール

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top