2011-08-25 25 views
8

Tôi đang viết một bài kiểm tra cho một chương trình sẽ được sử dụng trong nhiều ngôn ngữ. Trong khi chạy thử nghiệm bằng tiếng Đức, tôi đã nhận lỗiTại sao Python lưu các chuỗi định dạng thời gian của tiếng Đức và tiếng Tây Ban Nha (và khác?) Thành% T trong mô-đun ngôn ngữ?

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/_strptime.py", line 454, in _strptime_time 
    return _strptime(data_string, format)[0] 
    File "/usr/local/lib/python2.7/_strptime.py", line 317, in _strptime 
    (bad_directive, format)) 
ValueError: 'T' is a bad directive in format '%T' 

Đào vào điều này, tôi phát hiện ra rằng việc sử dụng locale.nl_langinfo(locale.T_FMT) trong khi ở Đức hoặc Tây Ban Nha (và các ngôn ngữ có khả năng khác) tạo ra chuỗi định dạng '%T'. Điều này không được công nhận trong time module.

Tài liệu trên locale tại python.org không đề cập đến bất kỳ điều gì về việc trả lại '%T'. Tham chiếu duy nhất đến '%T' tôi có thể tìm thấy bất kỳ nơi nào trong phản hồi với a separate StackOverflow question. Từ bài đăng và ngữ cảnh đó, tôi giả định '%T' là viết tắt của '%H:%M:%S'.

Câu hỏi của tôi là, làm thế nào để xử lý các miền địa phương mà locale sẽ trở lại '%T' cho chuỗi định dạng của nó mà không làm một cái gì đó giống như

if fmt_str == '%T': 
    fmt_str = '%H:%M:%S' 

để xử lý những trường hợp này?

+1

+1 Rất lạ. Một lỗi mô-đun tiêu chuẩn ra vô điều kiện, với một thông báo lỗi sucksy, đơn giản chỉ vì một sự thay đổi miền địa phương? – delnan

+0

Sự cố có vẻ là hai mô-đun không giao tiếp với nhau và 'miền địa phương' bắt đầu sử dụng tốc ký mà' thời gian' không nhận ra. Điều này rất kỳ lạ, bởi vì cả hai đều phải tuân theo tiêu chuẩn 'ngày 'thống nhất; 'locale' thực hiện trong khi' time' dường như không. – Staunch

+0

Không phải là môi trường cục bộ của tôi hỗ trợ '% T', đó là' locale' sử dụng '% T' làm viết tắt cho'% H:% M:% S' nhưng 'time' thì không.Các từ viết tắt trong 'locale' khớp với các định dạng của hàm ngày tháng của Unix (để xem chúng, gõ' date --h' tại dòng lệnh), nhưng 'time' sử dụng một danh sách các từ viết tắt. Đối với bản ghi, '% X' sẽ hoạt động, nhưng đó không phải là những gì đang được trả về bởi' locale'. – Staunch

Trả lời

1

Đây là một câu trả lời hoàn toàn không hài lòng, nhưng đây là câu trả lời anyway:

Lý do localetime.strptime không hoạt động tốt với nhau vì định dạng locale không được viết cho time.strptime. Chúng được viết cho time.strftime, để tạo ra các định dạng ngày/giờ cần thiết, không phân tích chúng.

time.strptime được viết là nền tảng độc lập, nó không chấp nhận nhiều chỉ thị như locale đưa ra; time.strftime cần phải có khả năng chuyển đổi bất kỳ thứ gì được ném vào nó, vì vậy nó chấp nhận bất kỳ chỉ thị do nền tảng xác định nào.

Vì vậy, không, không có cách nào dễ dàng hơn để thực hiện timelocale hợp tác theo cách tôi muốn họ.

0

Thực ra tôi thấy bạn đang sử dụng strptime, không phải strftime. Và tài liệu cho đề cập đến strptime:

Chỉ các chỉ thị được chỉ định trong tài liệu được hỗ trợ. Bởi vì strftime() được thực hiện trên mỗi nền tảng, đôi khi nó có thể cung cấp nhiều chỉ thị hơn so với những liệt kê. Nhưng strptime() độc lập với bất kỳ nền tảng nào và do đó không nhất thiết hỗ trợ tất cả các chỉ thị có sẵn mà không được tài liệu như được hỗ trợ.

Như đã đề cập here, bạn có thể sử dụng một phân tích cú pháp ngày mạnh hơn, như dateutil

>> import dateutil.parser 
>> dateutil.parser.parse("Thu Sep 25 10:36:28 2003") 
datetime.datetime(2003, 9, 25, 10, 36, 28) 
+0

Thật không may, 'dateutil' không phải là một mô-đun chuẩn, hoặc ít nhất nó không được cài đặt trên máy tính của nơi làm việc của tôi. :( – Staunch

+0

sau đó, vì strptime chỉ hỗ trợ định dạng ansi định dạng bạn phải chuyển đổi tất cả các tiêu chuẩn không chuẩn (mà bạn có thể) .bạn có thể sử dụng danh sách từ tài liệu của strftime trên nền tảng của bạn, như: http: //linux.die. net/man/3/strftime (và sử dụng dict thay vì 'if's) –

+0

nhưng tùy chọn tốt nhất có thể là lưu trữ tất cả các ngày là unixtimestamps và chỉ chuyển đổi với strftime khi bạn cần hiển thị chúng –

Các vấn đề liên quan