2009-09-18 33 views
7

thời gian tôi tự hỏi nếu có ai biết của một ngày và thời gian thư viện tốt mà có các tính năng một cách chính xác-thực hiện như sau:ngày Đầy đủ tính năng và thư viện

  • độ phân giải micro
  • tiết kiệm ánh sáng ban ngày
    • Ví dụ: nó biết rằng 2:30 sáng không tồn tại ở Hoa Kỳ ngày 8 tháng 3 năm 2009 cho múi giờ tôn trọng ánh sáng ban ngày tiết kiệm.
    • Tôi có thể chỉ định múi giờ như "US/Eastern" và nó đủ thông minh để biết liệu dấu thời gian cụ thể có tương ứng với EST hay EDT hay không.
  • ngày tùy chỉnh dao động
    • Khả năng tạo lịch kinh doanh chuyên ngành mà bỏ qua những ngày cuối tuần và ngày lễ.
  • thời gian Tuỳ chỉnh dao động
    • Khả năng xác định giờ làm việc để lần yêu cầu ngoài giờ làm việc có thể được làm tròn lên hoặc xuống để giờ hợp lệ tiếp theo hoặc trước đó.
  • Arithmetic
    • Có thể thêm và trừ một lượng số nguyên của tất cả các đơn vị (năm, tháng, tuần, ngày, giờ, phút, ...). Lưu ý rằng việc thêm một cái gì đó như 0,5 ngày không được xác định rõ bởi vì nó có thể có nghĩa là 12 giờ hoặc nó có thể có nghĩa là một nửa thời gian của một ngày (đó không phải là 24 giờ vào thay đổi tiết kiệm ánh sáng ban ngày).
  • ranh giới tự nhiên liên kết
    • Cho một dấu thời gian, tôi muốn có thể làm những việc như làm tròn xuống đến thập kỷ, năm, tháng, tuần, ..., giờ quý gần nhất, giờ vv

tôi hiện đang sử dụng Python, mặc dù tôi rất vui khi có một giải pháp trong một ngôn ngữ khác như perl, C, hoặc C++.

Tôi nhận thấy rằng các thư viện Python tích hợp thiếu tinh vi với logic tiết kiệm ban ngày và không có cách nào rõ ràng (với tôi) để thiết lập những thứ như phạm vi thời gian tùy chỉnh.

+1

"Tôi có thể chỉ định múi giờ như" US/Eastern "và cần đủ thông minh để biết liệu dấu thời gian cụ thể có tương ứng với EST hay EDT không." không nghĩ rằng đó là có thể, trừ khi bạn đưa ra một vị trí cụ thể hơn. Indiana mới chỉ mới bắt đầu làm DST, và Arizona và Hawaii vẫn không. –

+3

Trong trường hợp các múi giờ không bùng nổ đầu của bạn, một vài cái thú vị: Argentina quan sát tiết kiệm ánh sáng ban ngày trên mỗi tỉnh; mỗi tỉnh tự quyết định khi nào DST bắt đầu và kết thúc. Ấn Độ có một múi giờ bù đắp của +5: 30, làm cho "làm tròn đến giờ gần nhất" rất nhiều niềm vui.Nepal là +5: 45, khiến mọi thứ trở nên thú vị hơn rất nhiều. –

+1

Steven: "US/Eastern" ngụ ý rằng EDT được sử dụng. Nếu bạn ở Indiana, bạn ở Hoa Kỳ/Indiana-Starke, không phải Hoa Kỳ/Miền Đông. Tương tự, nếu bạn đang ở trong một phần của Arizona không theo DST, bạn đang ở Hoa Kỳ/Arizona (một số phần của tiểu bang). –

Trả lời

11

Module thư viện chuẩn của Python của datetime là cố ý giới hạn ở khía cạnh không gây tranh cãi mà không phải thay đổi tất cả các thời gian bằng cách fiat lập pháp - đó là lý do tại sao nó cố tình không bao gồm hỗ trợ trực tiếp cho các múi giờ, DST, phân tích mờ và số học mập mờ (chẳng hạn như "một tháng sau" ...) và tương tự.Trên đầu trang, dateutil đối với nhiều loại thao tác và pytz cho múi giờ (bao gồm cả các vấn đề DST), thêm hầu hết những gì bạn yêu cầu, mặc dù không phải là cực kỳ những thứ bùng nổ như "ngày lễ" thay đổi cực kỳ không chỉ trên các nhà tuyển dụng trong phạm vi quyền hạn nhạo báng (ví dụ ở Mỹ, một số nhà tuyển dụng coi "Ngày Columbus" là một kỳ nghỉ, nhưng nhiều người không - và một số, với văn phòng ở nhiều địa điểm, có nó như một kỳ nghỉ ở một số địa điểm không phải ở những người khác, với điều này hoàn toàn hỗn loạn, hy vọng tìm thấy một thư viện đa năng mà bằng cách nào đó kỳ diệu làm cho cảm giác của sự hỗn loạn là khá lạ).

+0

+1: và nếu bạn thực sự cần, bạn có thể xử lý lịch ngày lễ bằng mô-đun dateutil. Về cơ bản bạn cần cấu hình rruleset, bao gồm các quy tắc cho mỗi kỳ nghỉ. sau đó bạn có thể kết hợp những quy tắc với lịch cơ sở của bạn vv Tất nhiên bạn phải cấu hình tất cả bởi chính bạn, nhưng điều này có thể được thực hiện ít nhất một lần và sau đó được sử dụng trong thư viện của bạn cho tất cả các công ty/dự án – van

+0

chúng ta hãy bỏ qua nó và để người dùng đối phó với mớ hỗn độn ". Cảm ơn python. – Basic

4

tôi sẽ có thể xác định một múi giờ như "Mỹ/Đông" và nó phải đủ thông minh để biết liệu một cho timestamp phải tương ứng với EST hoặc EDT.

Phần này không phải lúc nào cũng có thể - theo cùng cách mà 2:30 không tồn tại trong một ngày trong năm (trong múi giờ tiết kiệm ánh sáng ban ngày vào lúc 2:00 sáng), 2:30 sáng hai lần cho một ngày khác - một lần trong EDT và sau đó một giờ sau EST. Nếu bạn vượt qua ngày/giờ đó vào thư viện, làm thế nào để biết bạn đang nói về hai lần nào?

+0

Tôi muốn nó làm điều gì đó thông minh với 2:30 sáng trong mỗi trường hợp. Từ những gì tôi đã tìm thấy trong thư viện pytz, không có cách nào để hỏi nó nếu một dấu thời gian không tồn tại hoặc không rõ ràng. Miễn là thư viện có một cách rõ ràng để cung cấp thông tin này, tôi rất vui. –

2

Mặc dù sách đã quá mười tuổi, tôi thực sự khuyên bạn nên đọc Standard C Date/Time Library: Programming the World's Calendars and Clocks bởi Lance Latham. Đây là một trong những cuốn sách mà bạn sẽ chọn lại theo thời gian trong sự ngạc nhiên rằng nó đã được viết ở tất cả. Tác giả đi vào chi tiết hơn bạn muốn về các hệ thống lưu giữ thời gian và lịch, và dọc theo cách phát triển mã nguồn tới một thư viện (được viết bằng C) để xử lý tất cả các tính toán.

Thật ngạc nhiên, có vẻ như vẫn đang được in ...

6

Thấy ngày này, tôi không tự mình sử dụng ... trông đầy hứa hẹn. http://crsmithdev.com/arrow/

+0

Cảm ơn bạn - Tôi cứ nghĩ "có ai đó đã sửa lỗi này cho tôi ngay bây giờ, đúng không?" Vui mừng khi thấy một nỗ lực để mang lại sự tỉnh táo cho trăn – Nick

1

Tôi vừa phát hành thư viện Python có tên Fleming (https://github.com/ambitioninc/fleming) và có vẻ như giải quyết hai vấn đề của bạn với sự tinh tế liên quan đến Giờ tiết kiệm ánh sáng ban ngày.

Bài 1, Số học - Fleming có hàm add_timedelta lấy một timedelta (từ mô-đun ngày giờ của Python) hoặc relativedelta từ python-dateutil và thêm nó vào đối tượng datetime. Hàm add_timedelta xử lý trường hợp khi đối tượng datetime vượt qua một ranh giới DST. Hãy xem https://github.com/ambitioninc/fleming#add_timedelta để có giải thích và ví dụ hoàn chỉnh. Dưới đây là ví dụ ngắn:

import fleming 
import datetime 
import timedelta 

dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=2, days=1)) 
print dt 
2013-03-29 20:00:00-04:00 
# Do timedelta arithmetic such that it starts in DST and crosses over into no DST. 
# Note that the hours stay in tact and the timezone changes 
dt = fleming.add_timedelta(dt, datetime.timedelta(weeks=-4)) 
print dt 
2013-03-01 20:00:00-05:00 

Bài toán 2, Liên kết ranh giới tự nhiên - Đường kẻ có chức năng sàn có thể căn chỉnh tùy ý. Giả sử thời gian của bạn là datetime (2013, 2, 3) và bạn đã cho nó một khoảng thời gian sàn của tháng = 3. Điều này có nghĩa là nó sẽ làm tròn đến tháng gần nhất (quý). Bạn có thể chỉ định tương tự thập kỷ gần nhất bằng cách sử dụng năm = 10 trong các đối số. Hãy xem (https://github.com/ambitioninc/fleming#floordt-within_tznone-yearnone-monthnone-weeknone-daynone-hournone-minutenone-secondnone-microsecondnone) để biết ví dụ và minh họa đầy đủ. Đây là một cách nhanh chóng:

import fleming 
import datetime 

# Get the starting of a quarter by using month=3 
print fleming.floor(datetime.datetime(2013, 2, 4), month=3) 
2013-01-01 00:00:00 
Các vấn đề liên quan