2010-09-18 48 views
5

Chạy asp.net mvc 2 trên win 7 với .net 4.0TimeZoneInfo.ConvertTime không chuyển đổi bất cứ điều gì

Tôi có một phương thức hành động điều khiển nhận 2 đối tượng DateTime từ biểu mẫu. Giao diện người dùng trên biểu mẫu sử dụng trình ghi ngày tháng jQueryUi (không chắc chắn nếu trình theo dõi đó).

Người dùng điền vào biểu mẫu đó sẽ luôn nhập ngày/giờ trong múi giờ Hawaii.

Tôi muốn chuyển đổi thành thời gian UTC và lưu trữ nó trong cơ sở dữ liệu.

Khi tôi gọi TimeZoneInfo.ConverTime (DateTime, TimeZoneInfo, TimeZoneInfo), nó trả về cùng một ngày giờ chính xác khi tôi chuyển vào nó mà không thực hiện bất kỳ chuyển đổi nào. Tôi đã kiểm tra trình gỡ lỗi và điều duy nhất thay đổi là nó đã thay đổi thuộc tính DateTime.Kind thành DateTimeKind.Utc.

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

Tôi đã thử phiên bản thay thế với cùng kết quả.

public ActionResult New(ScheduleNew data){ 
    DateTime start = new DateTime(data.StartDate.Year, data.StartDate.Month, data.StartDate.Day, data.StartDate.Hour, data.StartDate.Minute, data.StartDate.Second, DateTimeKind.Unspecified); 
    DateTime end = new DateTime(data.EndDate.Year, data.EndDate.Month, data.EndDate.Day, data.EndDate.Hour, data.EndDate.Minute, data.EndDate.Second, DateTimeKind.Unspecified); 

    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    StartDate = TimeZoneInfo.ConvertTime(start, tz, TimeZoneInfo.Utc); 
    EndDate = TimeZoneInfo.ConvertTime(end, tz, TimeZoneInfo.Utc), 
} 

ScheduleData chỉ là lớp ViewModel đơn giản có hai ngày Giờ được gọi là StartDate và EndDate.

Tôi muốn nhấn mạnh, tôi không quan tâm vị trí của máy chủ, tôi không quan tâm vị trí của người dùng. Người dùng sẽ luôn nhập thời gian trong múi giờ Hawaii và máy chủ phải luôn chuyển đổi ngày giờ đó thành UTC.

Về cơ bản những gì tôi muốn, là thêm 10 giờ vào thời điểm người dùng nhập (tiếng Hawaii sang utc) và tôi có thể đạt được điều đó bằng cách gọi .AddHours (10) và điều đó sẽ ổn. Nhưng sau đó trên con đường tôi sẽ cần ứng dụng này linh hoạt hơn.

+0

bạn có khắc phục được sự cố không? – Rory

+0

Loại dữ liệu.StartDate là gì? – Rory

Trả lời

4

Nếu bạn muốn tiếp cận linh hoạt hơn, hãy thử một cái gì đó như thế này:

DateTime now = DateTime.UtcNow; 

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 
TimeSpan utcOffset = timeZoneInfo.GetUtcOffset(now); 
DateTime hawaiianTime = new DateTime(now.Ticks + utcOffset.Ticks, DateTimeKind.Local); 

này nên làm việc một cách chính xác không có vấn đề gì múi giờ bạn đang sử dụng. Nhân tiện: Nếu tôi là bạn, tôi sẽ tạo ngày bắt đầu và ngày kết thúc là DateTimeKind.Utc (và lưu trữ tất cả dữ liệu lịch biểu dưới dạng UTC). Tôi không chắc chắn như thế nào GetUtcOffset() sẽ làm việc với loại thời gian không xác định ...

Cập nhật trên GetUtcOffset()

Dường như GetUtcOffset() hoạt động giống hệt nhau cho DateTimes tạo với các giá trị DateTimeKind khác nhau. Tuy nhiên, tôi chưa thử nghiệm nó với đầu vào không hợp lệ (ví dụ: với những ngày không tồn tại do chuyển đổi thời gian tiết kiệm ánh sáng ban ngày). Tôi tin rằng DateTimeKind.Utc là khá tiết kiệm ở đây, nhưng nó có thể cho địa phương hoặc Unspecified.

3

Tôi không thể tìm thấy bất kỳ sự cố nào với mã của bạn ... Có vẻ như nó nên hoạt động. Có bạn đã thử các dự khuyết:

DateTime start = TimeZoneInfo.ConvertTimeToUtc(data.StartDat, tz); 
2

thử mã này

var dt = new DateTime(YourOldDate.Ticks, DateTimeKind.Utc); 
DateTime NewDate = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local); 

này đã làm việc với tôi, có thể là bạn có thể cung cấp cho một thử.

0

Dường như trong mã bạn không làm gì với kết quả của chuyển đổi.

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

Giá trị startend được đặt, nhưng không bao giờ được trả lại. Trên thực tế, không có giá trị nào được trả về ở đây, do đó, điều này không nên biên dịch. Có lẽ có nhiều thứ mà bạn không thể hiện.

Ở bất kỳ mức nào, chính chuyển đổi cũng ổn. Miễn là data.StartDatedata.EndDateUnspecified loại, thì nó sẽ hoạt động như mong đợi. Bạn có thể làm cho nó hơi sạch hơn mặc dù bằng cách sử dụng TimeZoneInfo.ConvertTimeToUtc thay thế.

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