2008-12-03 20 views

Trả lời

21

này phức tạp hơn nhưng tôi đã phải sử dụng kịch bản này trước đây vì cài đặt máy và hồ sơ người dùng đôi khi không khớp với tùy chọn của khách truy cập của bạn. Ví dụ: một khách truy cập Vương quốc Anh truy cập trang web của bạn tạm thời từ một máy chủ của Úc.

  1. Sử dụng dịch vụ định vị địa lý (ví dụ: MaxMind.com) theo đề xuất của @balabaster, để có được vùng phù hợp với IP của họ (Global.Session_Start là tốt nhất). Đây là một kết hợp tốt cho các ISP địa phương, nhưng không tốt cho AOL. Lưu trữ bù đắp từ điều này trong một cookie phiên.

  2. Hoặc sử dụng JavaScript để nhận chênh lệch múi giờ như một phần của việc gửi/chuyển biểu mẫu khi người dùng nhập trang web. Đây là bù đắp hiện tại của trình duyệt, nhưng không nhất thiết là vùng ưa thích của khách truy cập. Sử dụng giá trị này làm mặc định; lưu trữ trong một cookie phiên khác.

    
    <script type="text/javascript" language="JavaScript"> 
    var offset = new Date(); 
    document.write('<input type="hidden" id="clientTzOffset" name="clientTzOffset" value="' + offset.getTimezoneOffset() + '"/>'); 
    </script> 
    
  3. Cho phép người truy cập để cập nhật các khu vực thông qua một cookie (cho người dùng ẩn danh) và một lĩnh vực trong hồ sơ tài khoản của họ (nếu chứng thực).

Giá trị dai dẳng # 3 từ ghi đè giá trị phiên. Bạn cũng có thể lưu trữ cùng một cookie cố định cho người dùng được xác thực để hiển thị thời gian trước khi họ đăng nhập.

0

Trong bất kỳ sự kiện nào trước khi tải trang ... Request.ServerVariables. Nếu bạn muốn múi giờ thực của họ thì bạn kiểm tra địa chỉ IP của họ và sử dụng công cụ chuyển đổi địa chỉ IP sang Geo-Location.

Tôi không chắc chắn nếu có một cách khác để bạn có thể làm điều đó, vì vậy nếu bạn đòi hỏi múi giờ máy tính của họ được cấu hình cho, nó sẽ phải chờ đợi tải trang cho một javascript ...

+2

Cảm ơn bạn đã tạo phiên bản dài nhất hte của Không tôi đã nghe hôm nay. – DevelopingChris

+0

Tôi từng tự hỏi tại sao tôi có quảng cáo địa phương cho Oslo, Na Uy mỗi khi tôi lướt net bằng Opera Mini trên điện thoại của mình, trước khi tôi nhận ra rằng nó bị IP chuyển sang vị trí địa lý ... Nó chỉ xảy ra rằng Oslo là một vài các múi giờ cách xa nơi tôi sống :-) – Kaniu

+0

ChanChan: Bạn luôn có thể tin tưởng vào điều đó;) – BenAlabaster

5

Kiểm tra detect_timezone.js - làm một công việc khá tốt xác định múi giờ của người dùng

+0

Tôi đang tìm kiếm giải pháp phía máy chủ, để tôi có thể thực hiện những điều trong mã bộ nhớ đệm dựa trên múi giờ. Đây là một giải pháp tương tự cho những gì tôi đã sử dụng cuối cùng, và làm cho mã kết thúc trở lại không quan tâm nhiều, nhưng nó sẽ là tốt đẹp để có được offsets như là một phần của yêu cầu khách hàng. – DevelopingChris

+1

than ôi, bạn không thể làm điều đó một cách đáng tin cậy. – Bozho

+0

không đáng tin cậy. Có thể người dùng đã đặt thời gian không chính xác trong hệ thống của mình – shashwat

-1

Chúng tôi có thể nhận được các múi giờ sử dụng mã dưới đây vào phía máy chủ thay vì gửi giá trị từ khách hàng.

private TimeZoneInfo GetRequestTimeZone() 
    { 
     TimeZoneInfo timeZoneInfo = null; 
     DateTimeOffset localDateOffset; 
     try 
     { 
      localDateOffset = new DateTimeOffset(Request.RequestContext.HttpContext.Timestamp, Request.RequestContext.HttpContext.Timestamp - Request.RequestContext.HttpContext.Timestamp.ToUniversalTime()); 
      timeZoneInfo = (from x in TimeZoneInfo.GetSystemTimeZones() 
          where x.BaseUtcOffset == localDateOffset.Offset 
          select x).FirstOrDefault(); 
     } 
     catch (Exception) 
     { 
     } 
     return timeZoneInfo; 
    } 

Thanks ...

+0

Bạn đã thử điều này trên một máy chủ được đặt thành UTC và một khách hàng được đặt thành múi giờ thực tế của bạn. – DevelopingChris

+2

Bạn hấp dẫn tôi đủ để lãng phí một vài phút thời gian của tôi thử nghiệm này, nhưng xin lỗi. Đi câu cá. Khái niệm thú vị. Nếu trình duyệt sẽ chỉ gửi thời gian địa phương của họ với tiêu đề yêu cầu theo mặc định. – johnw182

+0

Điều này dường như chỉ đơn thuần là một cách vòng xoay để xác định múi giờ của máy chủ, có thể được thực hiện đơn giản hơn nhiều. –

0

Có cách nào để làm offsets múi giờ của bạn ở phía máy chủ, bởi đọc một cái gì đó trong yêu cầu qua http, thay vì gửi tất cả mọi thứ cho khách hàng và để nó đối phó với nó?

Đây là giải pháp tôi đã đưa ra, khi tôi đã có cùng một vấn đề với các dịch vụ web WCF:

How to get a WCF Web Service to return DateTimes in user's local timezone

Về cơ bản, tôi nhận JavaScript/code góc của tôi để xác định múi giờ của người dùng, sau đó chuyển giá trị này cho một trong các dịch vụ web WCF của tôi.

Lưu ý cách tôi có dịch vụ web được gọi là getListOfRecords có một thông số, giá trị bù theo múi giờ.

$scope.loadSomeDatabaseRecords = function() { 

    var d = new Date() 
    var timezoneOffset = d.getTimezoneOffset(); 

    return $http({ 
     url: 'http://localhost:15021/Service1.svc/getListOfRecords/' + timezoneOffset, 
     method: 'GET', 
     async: true, 
     cache: false, 
     headers: { 'Accept': 'application/json', 'Pragma': 'no-cache' } 
    }).success(function (data) { 
     $scope.listScheduleLog = data.Results; 
    }); 
} 

Từ đó, mã của tôi # C đọc trong hồ sơ cơ sở dữ liệu, áp dụng múi giờ mà bù đắp cho DateTime giá trị UTC, và trả nó cho khách hàng.

+0

Tôi chạy vào một nếp nhăn khác, điều này làm phức tạp hơn nữa. cách thức này xử lý ngày trả lại cho tháng 12 tiếp theo trong múi giờ của tôi cho Tiết kiệm ban ngày. Nếu nó chỉ sử dụng bù đắp, sau đó nhiều múi giờ phù hợp, và hầu hết trong số họ không sử dụng tiết kiệm ánh sáng ban ngày. – DevelopingChris

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