2015-06-19 15 views
15

Accordingtomultiplepostings, Microsoft đã bật khả năng sử dụng cài đặt Ứng dụng - WEBSITE_TIME_ZONE - để kiểm soát múi giờ của máy chủ web.Thay đổi múi giờ trên ứng dụng web Azure Không hoạt động cho DateTimeOffset.Now?

Để thử điều này, tôi đặt giá trị này thành "Giờ chuẩn miền Đông" là múi giờ địa phương của tôi.

Trên một trang ASP.NET MVC Razor, tôi đã thêm đoạn mã sau:

DateTime.Now: @DateTime.Now 
DateTimeOffset.Now: @DateTimeOffset.Now 
DateTime.UtcNow: @DateTimeOffset.UtcNow 

khi tôi chạy đêm qua này tại 17:10:07 Giờ chuẩn Đông, nó đã cho kết quả như sau:

DateTime.Now: 6/18/2015 5:10:07 PM 
DateTimeOffset.Now: 6/18/2015 5:10:07 PM +00:00 
DateTime.UtcNow: 6/18/2015 9:10:07 PM 

Như bạn có thể thấy, cài đặt được cho phép chính xác DateTime.Now để trả lại giá trị chính xác trong múi giờ của tôi thay vì UTC như Trang web Azure/Ứng dụng web thường làm. DateTime.UtcNow luôn trả về giá trị chính xác vì lý do hiển nhiên.

Tuy nhiên, DateTimeOffset.Now trả về giờ địa phương nhưng với độ lệch là +00:00 - gần như thể đồng hồ đã thay đổi thay vì múi giờ. Điều này xảy ra mặc dù documentation nói (tôi nhấn mạnh):

Gets một đối tượng DateTimeOffset được thiết lập ngày hiện tại và thời gian trên máy tính hiện nay, với bù đắp thiết lập để thời gian địa phương của bù đắp từ Coordinated Universal Time (UTC).

Vì vậy, những gì đang xảy ra mà tác động thiết lập WEBSITE_TIME_ZONEDateTime.Now nhưng nó không ảnh hưởng đến DateTimeOffset.Now? Và có cách nào tôi có thể vượt qua điều đó không?

Để làm rõ, tôi không thực sự muốn thay đổi múi giờ trên máy chủ. Chúng tôi đang làm việc trên một giải pháp độc lập múi giờ thích hợp. Nhưng tôi vẫn tò mò tại sao điều này lại xảy ra.

+2

Bạn có thực sự cần thay đổi múi giờ của máy chủ không? Tôi sẽ cố hết sức để tránh yêu cầu đó. Tôi đồng ý rằng đó là hành vi kỳ lạ của DateTimeOffset.Now, hãy nhớ ... –

+0

Tôi đang tranh luận giải thích rằng trong OP. Tôi rất muốn không thay đổi múi giờ của máy chủ. Chỉ trong khi khám phá các tùy chọn, tôi chạy ngang qua cái này và không hiểu nó hoạt động như thế nào (hoặc tại sao nó không hoạt động theo cách tôi nghĩ). Vì vậy, tôi nghĩ rằng tôi sẽ cố gắng để làm rõ. – Tim

+1

Làm cho tinh thần - và tôi là tất cả để thử nghiệm với những điều bạn sẽ không thực sự muốn làm :) –

Trả lời

0

Tôi đang gặp sự cố tương tự. Thật không may cho tôi, tôi thừa hưởng rất nhiều mã di sản được viết riêng cho Giờ chuẩn miền Đông, vì vậy việc cập nhật nó để làm việc với UTC về cơ bản không phải là một lựa chọn.

Sau khi đào sâu vào mã CLR, có vẻ như là do thực tế là múi giờ địa phương được tra cứu dựa vào đăng ký hệ thống. Không thấy cách họ có thể hỗ trợ đúng cách mà không cần thay đổi mã CLR vì Azure Web Apps chạy trên các máy ảo được chia sẻ.

Hiện tại, tôi sẽ giải quyết vấn đề này với bản hack phản chiếu sau khi khởi động trang web để lừa .Net nghĩ rằng đó là giờ chuẩn miền Đông. Nó không phải là một giải pháp tuyệt vời, và rất có thể sẽ phá vỡ nếu họ thay đổi việc thực hiện lớp TimeZoneInfo, nhưng hy vọng lý do cho việc thay đổi nó sẽ là giải quyết vấn đề này.

// rewrite local timezone 
var tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

var fInfo = typeof(TimeZoneInfo).GetField("s_cachedData", BindingFlags.Static|BindingFlags.NonPublic); 
var cachedData = fInfo.GetValue(null); 

fInfo = cachedData.GetType().GetField("m_localTimeZone", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); 
fInfo.SetValue(cachedData, tz); 
5

Tốt cho tôi, nó hoạt động ngay bây giờ.Nếu nó không làm việc chắc chắn rằng bạn thiết lập giá trị đúng

  1. mở regedit
  2. Tìm kiếm "múi giờ"
  3. Kiểm tra cách khu của bạn được viết. Ví dụ: khu vực của tôi là "EST EST (+2)" và đăng ký tên của nó là "E. Giờ chuẩn Châu Âu"

Vì vậy, tôi được thêm vào cài đặt ứng dụng trong ứng dụng azure "WEBSITE_TIME_ZONE: E. Europe Standard Time" và hoạt động.

+0

Câu trả lời này có hiệu quả, nhưng tìm kiếm regedit là loại ngớ ngẩn (và giá trị mà tôi đang tìm kiếm thậm chí không nằm trong sổ đăng ký của tôi). Các giá trị nên được xuất bản ở đâu đó thay vì phải làm điều đó. Dù sao, FYI cho những người ở Nhật Bản, giá trị là "Giờ chuẩn Tokyo". Có một bài đăng blog tuyệt vời về điều này ở đây (chỉ dành cho Jp) http://blog.shibayan.jp/entry/20150909/1441725327 – starmandeluxe

+0

@starmandeluxe tốt nhất là bắt đầu sử dụng UTC, bây giờ tôi đã kết thúc rằng tôi phải di chuyển sang UTC: (nó sẽ đòi hỏi một chút efford để làm điều đó. –

+0

cảm ơn cho các đề nghị! Thật không may tôi đang ở trong cùng một thuyền như bạn đang làm việc trên một codebase di sản mà không thể di chuyển ngay lập tức kể từ khi phát hành cần phải tiếp tục xảy ra. điểm này tôi chỉ cần nó để làm việc. – starmandeluxe

2

Đối với những người vấp ngã khi câu hỏi này. Điều này đã được sửa chữa trong một thời gian dài.

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