2013-03-20 35 views
7

Trong ứng dụng MVC4 C# tôi đã sử dụng DateTime.Now khi đối tượng được tạo trong ứng dụng của tôi. Sau khi triển khai, có sự khác biệt +8 giờ giữa máy tính cục bộ và lưu trữ. Sau đó, tôi đổi nó thành DateTime.UtcNow, giờ khác biệt là -4 giờ.Có sự khác biệt giữa giờ địa phương và máy chủ

Ví dụ trong ngày máy tính của tôi là 20 Mar 2013, 14:28:12, nhưng các cửa hàng ngày để cơ sở dữ liệu như 20 Mar 2013, 10:28:12.

Những gì tôi nên làm tất cả những người sử dụng trong tất cả các nước sử dụng 1 ngày giống nhau không?

Edit: múi giờ của tôi là (UTC + 04: 00) Baku, máy chủ được sau PST

+4

Đây là một dành cho @JonSkeet, anh ấy thích các câu hỏi về thời gian ngày :) – mattytommo

+0

Hmm. Không phải là người yêu cầu nếu nó được cắm vào, nhưng: Ngày/giờ trên máy chủ có đúng không? Ít nhất, nó có khớp với cái trên hộp của bạn không? – FrankieTheKneeMan

+0

CSONG: Múi giờ nào là máy chủ và bạn đang ở múi giờ nào? – FrankieTheKneeMan

Trả lời

3

Giả sử người dùng của bạn ở New York (GMT - 5) và máy chủ của bạn ở Ấn Độ (GMT + 5:30).

Khi người dùng thấy thời gian "địa phương" lúc 10:00 sáng (EST), máy chủ của bạn sẽ thấy thời gian "địa phương" là 7:30 tối (IST). Tuy nhiên, bằng cách sử dụng UTC ở cả hai nơi .... người dùng sẽ thấy thời gian UTC là 3 giờ chiều và máy chủ sẽ thấy thời gian UTC là 3 giờ chiều.

Sử dụng UTC ở tất cả các vị trí nhưng giữ giới thiệu múi giờ của người dùng cho phép bạn luôn hoạt động trong UTC nhưng vẫn chuyển đổi thời gian thành thời gian "cục bộ" của người dùng khi bạn muốn hiển thị cho họ.

Bạn cũng không thể dựa vào nơi máy chủ được lưu trữ trên máy chủ nếu nó là máy chủ ảo. Bạn cũng không thể giả định múi giờ mà công ty lưu trữ đặt máy chủ của họ thành. Tốt nhất để luôn mã hóa defensivly bằng cách sử dụng DateTime.UtcNow khi lưu trữ ngày giờ trong cơ sở dữ liệu.

Để chuyển đổi thời gian tính theo giờ UTC này trở lại múi giờ của một người sử dụng, bạn sẽ cần phải làm như sau:

DateTime utcTime = new DateTime(2013, 03, 25, 10, 20, 00); 
TimeZoneInfo usersTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime usersLocalTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, usersTimeZone); 
Console.WriteLine(utcTime.ToString("hh:mm:ss"); 
Console.WriteLine(usersLocalTime.ToString("hh:mm:ss"); 

FYI, bạn có thể tìm thấy một danh sách các múi giờ từ:

TimeZoneInfo.GetSystemTimeZones() 

Điều này sẽ in ra:

10:20:00 
05:20:00 

Như bạn có thể thấy, bạn sẽ cần phải biết múi giờ của người dùng.Có 2 cách để biết thời gian người sử dụng:

  1. Có người dùng chọn múi giờ của họ trong tùy chọn người dùng của họ
  2. Sử dụng một số javascript để phát hiện múi giờ của máy của họ và gửi nó trở lại với hình thức

Tôi sẽ đề xuất tùy chọn đầu tiên ở đây là tùy chọn thứ hai có thể khiến mọi thứ trở nên khó khăn hơn cho mọi người. Ví dụ, nếu họ là Vương quốc Anh dựa và bay đến các tiểu bang trong tuần. Mọi thứ sẽ thay đổi khu vực và họ có thể không nhận ra!

+0

Tôi đã lưu các ngày như DateTime.UtcNow. Bây giờ, DateTime.UtcNow.ToLocalTime() không hoạt động đúng. –

+0

Bạn đang cố gắng chuyển đổi thời gian trở lại sau khi lấy lại từ cơ sở dữ liệu? Nếu vậy, đối tượng DateTime không biết thời gian cục bộ của người dùng là gì. Nó sẽ sử dụng thời gian cục bộ của máy chủ. Tôi sẽ cập nhật câu trả lời của tôi để bổ sung thêm chi tiết về những gì bạn cần làm để lấy lại thời gian gốc ... – Penfold

+0

cảm ơn vì điều đó, tôi hiểu rằng, tôi chỉ có thể làm điều đó với javascript. Đối với 10 ngày ở phía máy chủ tôi gõ một số mã như ToLocalTime() vv để hiển thị ngày/giờ với thời gian địa phương của người dùng. Vì vậy, nó không đúng như bạn nói. cảm ơn cho nó. Tôi có thể quản lý nó với toàn cầu hóa (văn hóa và uiCulture)? –

2

khi tôi đang làm việc trên một dự án được sử dụng bởi người dùng quốc tế, chúng tôi sẽ luôn luôn sử dụng DateTime.UtcNow

nếu nó là một dự án địa phương - tức là chỉ được thiết kế để sử dụng trong múi giờ của bạn thì DateTime.Now sẽ là đủ.

1

Giờ địa phương của bạn là thời gian hệ thống của bạn. Kiểm tra múi giờ trong hệ điều hành của bạn. Thời gian máy chủ bạn đang giới thiệu là theo múi giờ trong các tệp cấu hình máy chủ của bạn.

Đảm bảo bạn có múi giờ của hệ điều hành và múi giờ máy chủ tương tự.

+0

Giả sử rằng giờ địa phương và thời gian máy chủ của tôi là tương tự, nếu người dùng ở các quốc gia khác? múi giờ của họ khác nhau –

+1

Bạn có thể phát hiện múi giờ của người dùng và thời gian hiển thị theo múi giờ địa phương của họ. Giả sử tôi ở Ấn Độ, giờ địa phương của tôi là 5 giờ chiều. Máy chủ ở Ottawa, Canada và thời gian máy chủ là 7:30 sáng. Thời gian được lưu trữ trên máy chủ sẽ là thời gian máy chủ. Khi hiển thị cho người dùng, nó sẽ được chuyển đổi thành giờ địa phương. – Harpreet

+0

Ok, tôi hiểu. tôi đã thay đổi tất cả DateTime.UtcNow và sẽ chuyển đổi nó trước khi hiển thị. cảm ơn –

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