2011-03-03 20 views
1

考慮下面的代碼片段,它需要用戶輸入(日期),並使用UnixDate從日期:: MANIPPerl的日期:: MANIP - 如何在給定的日期轉換爲另一時區

#!/usr/bin/perl 
use Date::Manip; 

my $input = join(" ", @ARGV); 
my $date = UnixDate($input, "%Y-%m-%d %T"); 
print $date; 

這是格式化以允許用戶輸入友好日期,如「昨天」或「1周前」。

我想使用$ date與不同的時區(它將用於提取SQL數據)。這將如何完成? 我沒有找到任何構造UnixDate,這將允許放置一個時區,我不知道如何重新格式化用戶輸入(將時區名稱連接到它沒有幫助)。

用戶則介於中歐(時區:CET),進入 「今天下午1點」。執行上面的代碼如下:

$ ./test.pl today at 1pm 
2011-03-03 13:00:00 

這是因爲沒有時區更改生效的預期結果。我想要的是將$ date與另一個時區一起使用,例如,太平洋標準(時區:PST)。在這種情況下,輸出應爲:

$ ./test.pl today at 1pm 
2011-03-03 04:00:00 

回答

4

嘗試Date_ConvTZ()功能:

my $date = UnixDate(Date_ConvTZ($input, 'CET', 'PST'), "%Y-%m-%d %T"); 

從手動從Date::Manip::DM6

+1

是的!真棒。正是我在找什麼。那就是在Date :: Manip頁面上。 – emx

0

我不知道如何使Date::Manip瞭解時區,但是這將是相當直截了當與DateTime

my $input = join(" ", @ARGV); 
my $date = UnixDate($input, "%Y-%m-%d %T"); 
$date =~ /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/; 
my $dt = DateTime->new(
    year  => $1, 
    month  => $2, 
    day  => $3, 
    hour  => $4, 
    minute => $5, 
    second => $6, 
    time_zone => 'CET', 
); 
$dt->set_time_zone('America/Vancouver'); # My DateTime::TimeZone doesn't have PST 

你也許可以取代您Date::Manip也與DateTime modules中的一個或多個一起使用,DateTime是Perl的標準日期操作庫,因此使用它可以滿足所有日期時間需求; OTOH,使用適合你的方法,如果能完成工作,那麼使用Date::ManipDateTime可能沒有什麼壞處。

相關問題