2009-01-26 71 views
7

Tôi đang phát triển một phần mềm quốc tế hoạt động như một phần mềm quản lý dự án đơn giản và tôi đang gặp phải sự cố. Vấn đề này là về ngày/giờ và múi giờ.
Khi thư được gửi từ một múi giờ sang múi giờ khác, tôi có thể lưu trữ thời gian UTC (GMT) trong cơ sở dữ liệu của mình và sau đó hiển thị thông báo theo múi giờ của người dùng. Nhưng điều này không thể được thực hiện khi tôi chỉ làm việc với ngày.
Nếu tôi nói một nhiệm vụ là vào ngày 21 tháng 3. Tôi có nên xem xét rằng ngày này có thể là 20 hoặc 22 ở một số quốc gia khác không? Lời khuyên của bạn về vấn đề này là gì?Tôi làm cách nào để xử lý ngày và giờ theo múi giờ khác nhau?

+0

Tôi có thể đặt một plug không biết xấu hổ cho câu hỏi liên quan (nhưng khác biệt) của tôi về cách kiểm tra xử lý múi giờ chính xác không? http://stackoverflow.com/questions/477965/testing-correct-timezone-handling –

+1

Bạn phải tìm thấy nó thú vị rằng nếu bạn tìm kiếm trên các thẻ "bản địa hóa" hoặc "quốc tế hóa", bạn chỉ nhận được hai câu hỏi, nhưng nếu bạn tìm kiếm về "bản địa hóa" hoặc "quốc tế hóa", bạn nhận được đống! – Evan

Trả lời

4

Giả sử người dùng ở New York đặt ngày đến hạn cho dự án là "bất cứ lúc nào vào thứ Hai ngày 26 tháng 1". Điều đó có nghĩa là "bất cứ lúc nào từ 0600 Thứ Hai, 26 Tháng 1 đến 0600 Thứ Ba, ngày 27 tháng 1" tại Brussels và "bất kỳ lúc nào từ ngày Chủ Nhật 25 tháng 1 đến 2000 thứ Hai ngày 26 tháng 1" tại LA

Vì vậy, hoàn thành nhiệm vụ vào lúc 2100 ngày thứ Hai 26 là tốt tại Brussels và NY, nhưng đã quá muộn tại LA

Một công việc có thể xung quanh không bao giờ chỉ hoạt động với ngày tháng. Nếu thời gian không được chỉ định, hãy đặt thời gian cho 0000 hoặc 24 giờ vào ngày được chỉ định trong múi giờ của người dùng.

Người dùng có thể phải đối phó với các ngày/thời gian đến hạn kỳ lạ, nhưng nói như một người từng làm việc quốc tế, nó đi với lãnh thổ.

2

Bạn sẽ không thể đạt được những gì bạn đang cố gắng làm mà không lưu trữ thời gian chính xác. Bạn chỉ đơn giản là không có đủ thông tin.

2

Khi bạn không có thời gian, hãy giả sử thời gian kết thúc doanh nghiệp ở ngôn ngữ chính của ứng dụng, sau đó dịch thời gian đó theo bất kỳ lúc nào khác. Một thay thế sẽ được giả định kết thúc của ngày làm việc trong thời gian địa phương và điều chỉnh đó để UTC. Tất cả mọi người sử dụng ứng dụng sẽ cần phải hiểu bất cứ điều gì giả định thời gian mặc định bạn thực hiện khi thời gian không được chỉ định. Phối hợp với văn phòng chính có thể là tốt nhất trong một doanh nghiệp lớn trong khi phối hợp với thời gian địa phương có thể là tốt nhất trong môi trường phi tập trung cao, nơi bối cảnh địa phương cũng quan trọng không kém.

+0

Cuối ngày trong UTC sẽ phản trực giác với người đặt ngày đến hạn (trừ khi tất nhiên, họ đã sống trong thời gian ZULU). – officemonkey

+0

@officemonkey - đó là lý do tại sao nó không phải là gợi ý đầu tiên của tôi. Tôi cho rằng sẽ tốt hơn nếu bạn chọn ngày kết thúc của ngày làm việc theo giờ địa phương và điều chỉnh điều đó cho mọi người khác. Điều đó có lẽ có ý nghĩa nhất đối với người vào nhiệm vụ. Tôi sẽ điều chỉnh câu trả lời. – tvanfosson

+0

Kết thúc kinh doanh quá mơ hồ. –

1

Giải pháp dễ nhất sẽ chỉ để hiển thị là cùng ngày cho mọi người. Thời hạn sau đó sẽ có hiệu lực vào nửa đêm trong múi giờ mới nhất.

Nếu không, hãy quyết định thời gian mặc định của thời hạn phải ở trong múi giờ mà tác vụ được tạo, ví dụ: Ngày 21 tháng 3 lúc 17:00 EST hoặc 22 tháng 3 00:00 EST và hiển thị trong múi giờ địa phương. Sự khác biệt múi giờ sau đó sẽ đẩy nó vào ngày hôm trước hoặc ngày hôm sau cho phù hợp với người xem.

0

Nếu bạn có một phiên bản DB, tôi sẽ lưu trữ tất cả các ngày trong dấu thời gian datetime của máy chủ DB của bạn. Nếu bạn đang định thời gian hàng, hãy xem xét GetDate() trong T-SQL hoặc làm giá trị mặc định của cột ngày được định thời gian. Sau đó, bạn có điểm tham chiếu duy nhất của bạn cho tất cả các lần. Hãy xem xét định dạng UTC ở đó.

Sau đó, tất cả khách hàng truy cập vào ngày làm chuyển đổi của riêng mình vào "giờ địa phương", có thể được giải thích bởi những thứ như: sở thích người dùng, ngày thời gian tem trên máy tính của khách hàng, vv

Mà không biết thêm, nó khó nói chính xác độ phân giải là gì.

1

SQL 2008 cho phép một kiểu dữ liệu ngày không có bất kỳ giá trị thời gian nào liên kết với nó. Điều đó cho phép một người nào đó nói rằng tôi cần điều này được thực hiện bởi ngày này, nhưng tôi không quan tâm nếu nó là +/- vài giờ. Nếu ngày được chọn là 1/1/2009 nhưng nó xảy ra vào ngày 1/2/2009 lúc 2 giờ sáng, họ có lẽ không quan tâm.

Khi người dùng cần điều gì đó được thực hiện trước ngày và giờ cụ thể, như đóng doanh nghiệp vào ngày 1/1/2009 thì bạn cần lưu trữ nó trong một DateTime dưới dạng UTC và chuyển đổi sang thời gian khách hàng cục bộ.

Điều này sẽ mất nhiều sự phức tạp để chỉ ra khi một thứ gì đó được hoàn thành, nó sẽ được hoàn thành gần một ngày cụ thể hoặc theo thời gian cụ thể.

2

Nếu bạn không lưu trữ số phút và giây, bạn phải giả định rằng ngày được nhập là ngày bạn muốn và không áp dụng bất kỳ điều chỉnh nào cho GMT. Chỉ cần đặt nó trong cơ sở dữ liệu như vậy. Những người trên bờ biển phía tây sẽ phải giả định rằng ngày đến hạn là như nhau bất kể bạn đang ở đâu trên thế giới. Nếu bạn muốn điều chỉnh múi giờ, bạn sẽ phải thu thập thêm thông tin, như giờ, phút và giây.

0

Giải pháp của bạn tùy thuộc vào ứng dụng và yêu cầu của bạn.

Lần đầu tiên tôi lưu trữ tỷ lệ chênh lệch UTC + trong cấu trúc dữ liệu của bạn, do đó dễ dàng hiển thị cho bất kỳ múi giờ nào.

Rất có thể nếu nhiệm vụ hoặc cuộc họp đến hạn vào lúc 12 giờ tối ngày 21/3 tại Luân Đôn thì sẽ xảy ra vào 21:30 ngày 21/3 tại Adelaide (+0930), nhưng đó là yêu cầu ứng dụng không phải bất kỳ tiêu chuẩn liên quan đến múi giờ nào .

Nếu bạn muốn tính linh hoạt tối đa, hãy thêm cờ có thể thực hiện đồng thời đồng thời ở mọi múi giờ hoặc cùng một lúc bất kể bạn ở đâu (so le) và hiển thị sự kiện tương ứng.

0

Bạn có thể muốn lưu trữ ngày trong đó nhận biết múi giờ. Điều này sẽ giúp bạn trong tính toán của bạn. Ví dụ, SQL Server 2008 hỗ trợ datetimeoffset that does precisely this. Ngoài ra, nếu bạn đang sử dụng SQL 2005 với một chút nỗ lực, bạn có thể viết loại dữ liệu SQL CLR của riêng bạn để hỗ trợ điều này.

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