2017-09-26 42 views
-2

是否可以使用POSIX模塊在Perl中將給定時間戳轉換爲GMT?下面是我已經試過了,但不知道爲什麼時間是如此的遙遠......使用POSIX將時間戳轉換爲GMT

use POSIX; 
my $shipts = "2017-09-23 20:53:00"; 
my $shiptsgmt = strftime("%Y-%m-%d %R", localtime(str2time($shipts, 'GMT'))); 
print "$shiptsgmt\n"; 

服務器的本地時間是太平洋時間,想我要做的是不正確的。以上產生2017-09-23 13:53我需要2017-09-24 03:53時間。

+0

什麼是'str2time'? – toolic

+0

使用POSIX允許str2time。 – rwfitzy

+0

我在POSIX文檔(v5.16和v5.27)中沒有看到... – zdim

回答

3

單獨的POSIX不能做到這一點,不是沒有內置和一點處理的幫助。

一種替代方案:Time::Piece爲核心,以我的經驗快得多比POSIX

perl -MTime::Piece -wE' 
    $d = "2017-09-23 20:53:00"; 
    $t = localtime->strptime($d, "%Y-%m-%d %H:%M:%S"); 
    $t = gmtime($t->epoch); 
    say $t->strftime("%Y-%m-%d %H:%M:%S"); 
' 

這將創建一個對象,然後使用模塊的(兼容)更換爲gmtime將其轉換爲GMT,returing的對象,也適當標記爲GMT。

strftime是相同的,但比POSIX擴展更輕,strptimefrom FreeBSD。 該模塊還有很多方法可以將日期時間對象的各個部分或表示形式作爲字符串以及其他一些實用程序一起獲取。另見Time::Seconds

DateTime通過其formatters進行解析和字符串化,可以很好地完成這一切。但它很重。


注意  這是相當容易落得正確使用該模塊,而這個回答做到了這一點之前ikegami固定它。所以請非常小心除基本以外的任何用途。轉換時區時,請參閱鏈接的答案

注意的是,上面的答案不V5.10工作,顯然是由於該模塊在當時的錯誤。

+0

@ikegami謝謝。我編輯了你的帖子,我現在發現它直接處理這個錯誤(和另一箇舊帖子,這顯然是一個騙局)的信息。如果我找到它們,我會添加更多適合的鏈接。 (我清除了我的一些評論,以使您的警告更加明顯。) – zdim

+0

@ikegami如果我可能會給您一個問題。我已經編寫了一個實用程序子類化'Time :: Piece'(仔細!)在這裏的特定用途,它的作用就像一個魅力。但是我永遠無法找到這樣的東西:這個模塊有什麼小故障,有邊緣案例,夏令時,沒有午夜或者類似的日子嗎? (不包括技巧和用戶錯誤。)我正在考慮上個世紀左右世界範圍內的日期時間的相當基本用途。我搜索和搜索,沒有發現任何擔心,但這是一個棘手的業務。雖然在這裏不能問這樣的東西:( – zdim

+0

它使用'localtime'作爲時區的東西,所以沒有關注的問題。T :: P的問題在於很容易對它做不正確的事情。 API設計失敗,而不是代碼中的錯誤。子類化可能會繼承這些問題。Encapsulation可能不會。 – ikegami

相關問題