2011-09-20 45 views
27

Tôi biết về mô-đun DateTime Perl và nhiều mô-đun DateTime::Format:: để phân tích các loại định dạng ngày/giờ cụ thể. Tuy nhiên, một số ví dụ về chuỗi ngày/giờ, làm thế nào tôi có thể tìm ra (tại thời điểm mã hóa/thiết kế, không phải khi chạy) mà tôi nên sử dụng mô-đun cụ thể nào?Làm thế nào để phân tích một chuỗi thành một đối tượng DateTime trong Perl?

Ví dụ, tôi muốn phân tích chuỗi như: October 28, 2011 9:00 PM PDT

Có một danh sách ở đâu đó trong những ngày/định dạng thời gian phổ biến nhất mà tôi có thể xem xét điều này và tìm thấy đó sẽ là mô-đun thích hợp nhất?

Tôi cũng biết về một số mô-đun cố gắng "đoán" định dạng cho từng chuỗi đã cho lúc chạy và làm tốt nhất. Nhưng, đối với các ứng dụng nhạy cảm, tôi muốn xác định (đúng nhất có thể) định dạng đầu tiên khi thiết kế một ứng dụng và sau đó sử dụng một mô-đun sẽ cảnh báo cho tôi nếu một chuỗi không khớp với định dạng được chỉ định.

Tôi nên làm như thế nào?

Trả lời

36

DateTime::Format::Strptime mất ngày/giờ chuỗi và phân tích chúng thành các đối tượng DateTime.

#!/usr/bin/perl 

use strict; 
use warnings; 

use DateTime::Format::Strptime; 

my $parser = DateTime::Format::Strptime->new(
    pattern => '%B %d, %Y %I:%M %p %Z', 
    on_error => 'croak', 
); 

my $dt = $parser->parse_datetime('October 28, 2011 9:00 PM PDT'); 

print "$dt\n"; 

Chuỗi ký tự được sử dụng trong mẫu là tiêu chuẩn POSIX. Xem 'man strftime' để biết chi tiết.

+0

Cảm ơn! Đây là lý do cuối cùng kết thúc. Tuy nhiên, tôi rất muốn xem danh sách các định dạng ngày tháng phổ biến hoặc tiêu chuẩn (ISO, RFC) để kiểm tra xem một số chuỗi cụ thể mà tôi có sẽ phù hợp với bất kỳ định dạng nào hay không. –

+0

Có danh sách mô-đun DateTime (cũ) (bao gồm một số mô-đun DT :: Định dạng) tại http: //datetime.perl.org/wiki/datetime/page/Modules –

+0

Không phải là một fan hâm mộ lớn của việc phải xác định định dạng chính xác như vậy – MikeKulls

14

Hãy xem mô-đun Date::Parse, tức là chức năng str2time(). Nó có hỗ trợ cho hầu hết các định dạng thường được sử dụng.

Ví dụ:

use Date::Parse; 
use DateTime; 

my $str = "Tue, 20 Sep 2011 08:51:08 -0500"; 
my $epoch = str2time($str); 
my $datetime = DateTime->from_epoch(epoch => $epoch); 
+1

cám ơn nhưng điều này chính xác là * không * những gì tôi muốn làm. Tôi không muốn hàm đoán định dạng của chuỗi; Tôi muốn có thể chỉ định định dạng mà mã sẽ mong đợi với độ chính xác. –

+0

Đẹp, đó là chính xác những gì tôi muốn làm :-) Tôi sẽ đề nghị một định dạng nhưng nếu ai đó thay đổi nó thì nó sẽ là nỗ lực tốt nhất. – MikeKulls

+0

Thực ra mô-đun đó dường như không tốt. Nó giải quyết 15/4/2015 đến 1429060633 nhưng 15/apr/2015 đến 1429020000. Thật khó để tưởng tượng những gì nó thậm chí làm ở đây vì đó là 11.28 giờ phân tích cú pháp ngày chỉ khác nhau. Không nên có thành phần thời gian. – MikeKulls

27

Tôi có xu hướng sử dụng Time::Piece đơn giản chỉ vì nó là một phần của bộ mô-đun Perl chuẩn kể từ phiên bản 5.10.

Bạn không thể đánh bại khả năng của nó là parse date strings.

my $time = Time::Piece->strptime(
     "October 28, 2011 9:00 PM PDT", 
     "%B %d, %Y %r %Z"); 
+0

Đáng buồn thay, nó không phải là một phần của mô-đun Perl tiêu chuẩn được thiết lập trong phiên bản 5.8 (đó vẫn là phiên bản cao nhất mà bạn có thể chạy RHEL 5.x). Mặc dù vậy, mặc dù vậy. –

+1

"vẫn là phiên bản cao nhất bạn có thể chạy trên RHEL 5.x". Điều đó không đúng. Đúng là RHEL 5.x đi kèm với Perl 5.8.8 là tiêu chuẩn. Nhưng không có gì ngăn cản bạn xây dựng một phiên bản mới hơn. –

+2

@DaveCross Có một điểm nhất định mà Chirs tạo ra. Không phải lúc nào cũng có thể cài đặt bản phát hành mới hơn của Perl ngoài RPM. Máy RHEL thường trong môi trường sản xuất của công ty (nếu không, bạn sẽ chạy Fedora hoặc Centos). Các hệ thống này thường sẽ không có bộ công cụ _developer hoàn chỉnh_ như trình biên dịch C được cài đặt trên chúng, bạn có thể không có quyền truy cập vào chúng để cài đặt công cụ và thậm chí nếu bạn có thể, những người điều hành môi trường sản xuất có thể xuống trên một người nào đó cài đặt một phiên bản không chính thức của Perl trên môi trường sản xuất. –

4

Nếu bạn đang tìm kiếm ngày common/định dạng thời gian có một cái nhìn tại DateTime::Locale

use DateTime::Locale 
my $locale = DateTime::Locale->load('DE_de'); 

The following methods return strings appropriate for the DateTime->format_cldr() method:

$locale->date_format_full() 
$locale->date_format_long() 
$locale->date_format_medium() 
$locale->date_format_short() 
$locale->date_format_default() 
$locale->time_format_full() 
$locale->time_format_long() 
$locale->time_format_medium() 
$locale->time_format_short() 
$locale->time_format_default() 
$locale->datetime_format_full() 
$locale->datetime_format_long() 
$locale->datetime_format_medium() 
$locale->datetime_format_short() 
$locale->datetime_format_default() 

Bạn có thể phân tích Ngày với các module DateTime::Format::CLDR

use DateTime::Format::CLDR; 
# 1. Basic example 
my $cldr = DateTime::Format::CLDR->new(
    pattern  => 'dd.MM.yyyy HH:mm:ss', 
    locale  => 'de_DE', 
    time_zone => 'Europe/Berlin', 
); 
my $dt = $cldr->parse_datetime('26.06.2013 11:05:28'); 
Các vấn đề liên quan