2009-05-14 33 views
9

Tôi thường cần hiển thị thông tin dựa trên hoặc chịu ảnh hưởng của thời gian địa phương thực tế khác nhau theo múi giờ. Có cách nào đáng tin cậy để nhận thời gian và/hoặc múi giờ hiện tại của người dùng không?Tự động phát hiện thời gian cục bộ hiện tại của người dùng bằng JavaScript hoặc PHP

Những vấn đề chính:

  • server-side code được dựa trên các máy chủ trang web hoặc ISP của người dùng
  • client-side code được dựa trên đồng hồ hệ thống của người dùng mà là quá dễ dàng thao tác

Các câu hỏi chính:

  • Có cần phải xác định vị trí địa lý của người dùng không?
  • Thời gian ISP có thể là hướng dẫn chính xác không?
  • Người dùng có thể thay đổi hoặc sửa đổi đồng hồ hệ điều hành?

Ví dụ:

Đếm ngược:

Chỉ 1 giờ, 3 phút, 56 giây để đi!

Vấn đề: giây để dựa trên nội dung; Đồng hồ hệ điều hành của người dùng, thời gian máy chủ lưu trữ (cộng hoặc trừ bù trừ), thời gian hệ thống ISP. Đây là dễ dàng nếu đồng hồ kết thúc tại cùng một thời gian cho tất cả các múi giờ, nhưng phức tạp hơn nếu đó là một đếm ngược đến một cái gì đó giống như nửa đêm theo múi giờ địa phương của người dùng)

Sửa log

mục niêm yết tại 3 : 03pm (10 giây trước)

Vấn đề: "10 giây" được tính bất kể người dùng, thời gian được điều chỉnh để khớp với múi giờ của người dùng.

lần mở cửa:

nhà hàng này mở cửa nay đến nửa đêm (AEST).

Issue: Đưa ra một thời gian như nửa đêm có thể được tính bằng cách bù đắp từ các server-side nhưng sử dụng lần psudo như bây giờ, trong 2 giờ là dựa trên thời gian của người dùng.

PHP: sử dụng time() xuất hiện thời gian máy chủ. Điều này có thể được bù đắp tùy thuộc vào múi giờ của người dùng.

JavaScript: sử dụng Date() xuất ra thời gian đồng hồ máy tính của người dùng quá dễ thao tác.

+2

Nếu người dùng thao tác trên đồng hồ máy tính, bạn không thể làm gì với nó. Tại sao bạn lo lắng về việc liệu đồng hồ người dùng có chính xác hay không? – Simurr

+0

Thời gian ISP không bao giờ xâm nhập vào nó. Hoặc là máy chủ tính toán thời gian và gửi nó cho máy khách hoặc máy chủ gửi một số JavaScript được diễn giải trên máy khách và tính toán thời gian. Bạn không thể biết thời gian đồng hồ hệ thống trên tất cả các bước nhảy ở giữa. –

+0

Nếu đồng hồ người dùng không chính xác thì JavaScript không phải là phương pháp đáng tin cậy. Nếu thời gian cần phải cụ thể, việc sử dụng có thể thao tác các kết quả, bỏ qua hoặc quay lại vv. –

Trả lời

8

Tóm lại không.

Tôi khuyên bạn nên sử dụng thời gian bên máy chủ và có khả năng người dùng chọn múi giờ của họ.

Bạn có thể tính toán múi giờ mặc định cho người dùng dựa trên chẩn đoán xung quanh địa chỉ IP của họ, nhưng điều này mở để báo lỗi.

Bạn sẽ có thể trích xuất thông tin múi giờ bên ứng dụng thông qua javascript/Ajax, nhưng với thời gian chính nó cũng bị lỗi.

Đề xuất của tôi: Cho phép người dùng chọn múi giờ của họ với mặc định hợp lý dựa trên nơi bạn mong đợi người dùng của mình.

+0

Thời gian phía máy chủ dựa trên ISP hoặc máy chủ có cả hai khác nhau, phía máy khách dựa trên đồng hồ hệ thống của người dùng có thể chỉnh sửa và không chính xác. –

+1

Trên máy chủ của tôi, tôi kiểm soát thời gian và tôi đảm bảo nó đúng. Nếu bạn đang ở trên chia sẻ lưu trữ thời gian nên được chính xác, nếu nó không phải là bạn nên khiếu nại. – DanSingerman

+1

Ồ, và không liên quan gì đến ISP của người dùng. – DanSingerman

3

Tôi khuyên bạn nên ghi ngày của máy chủ ra javascript. Sau đó, làm một ngày mới trong javascript để có được ngày được thiết lập bởi người dùng trên máy tính của họ. Sử dụng khác nhau trong hai ngày.

Với ngày máy chủ, bạn chắc chắn rằng thời gian của bạn không bị thiên vị. Tất cả các phép tính phải được thực hiện bằng ngày máy chủ.

Chỉ sử dụng sự khác biệt cho mục đích hiển thị. Điều này sẽ hoạt động tốt để chỉnh sửa nhật ký, đếm ngược và chọn thư như "Chào buổi sáng".

Nếu người dùng muốn thời gian của mình trở thành một thứ gì đó khác ... Tôi nghĩ bạn nên để anh ấy làm điều đó.

12

Với JavaScript, có cách để có được bù trừ múi giờ hiện tại của người dùng.

new Date().getTimezoneOffset() * -1 

trả về giá trị tính bằng phút từ GMT. Không lưu trữ giá trị này vì nó có thể thay đổi tùy thuộc vào Giờ tiết kiệm ánh sáng ban ngày. Nếu bạn cần nó trên máy chủ (php) thì bạn sẽ cần phải nắm bắt nó trong gửi nó.

Thật không may, thông số HTTP không gửi múi giờ của người dùng làm tiêu đề, đó là những gì php cần.

3

PHP có cả PECL extensionPEAR package có thể thực hiện tra cứu GeoIP. Giả sử người dùng không phải là một proxy hoặc NAT của một số loại, cơ sở dữ liệu là up-to-date và chính xác, và địa chỉ là trong cơ sở dữ liệu ở tất cả, bạn có thể nhận được timezone, và tính toán bù đắp từ thời gian máy chủ .

Hoặc, bạn chỉ có thể chấp nhận đồng hồ hệ thống của người dùng không chính xác 100%, nhưng nó thường rất gần. Tất cả các hệ điều hành chính có một số cách đồng bộ hóa đồng hồ của họ với các máy chủ thời gian mạng, hầu hết các hệ điều hành này được bật mặc định. Nếu người đó đã quyết định đặt máy tính của họ trong múi giờ "sai", có thể vì lý do (họ đi du lịch, họ làm việc với những người ở múi giờ khác).

Nếu người dùng có lý do nào đó đặt đồng hồ của họ thành 10 phút, họ chấp nhận hậu quả của việc tính toán thời gian không chính xác.


Added: Nếu đồng hồ máy chủ của bạn là chính xác (nếu không muốn nói, như HermanD nói, sửa chữa nó nếu bạn kiểm soát máy chủ, phàn nàn nếu bạn không) nhưng không có trong múi giờ đúng, bạn luôn có thể sử dụng PHP ini_set() hoặc date_default_timezone_set() để buộc các tập lệnh của bạn hoạt động trong GMT, bất kể múi giờ của hệ thống.

1

javascript:

<script type="text/javascript"> 
var currentTime = new Date() 
var hours = currentTime.getHours() 
var minutes = currentTime.getMinutes() 

if (minutes < 10){ 
    minutes = "0" + minutes; 
} 
var suffix = "AM"; 
if (hours >= 12) { 
suffix = "PM"; 
hours = hours - 12; 
} 
if (hours == 0) { 
hours = 12; 
} 

document.write("<b>" + hours + ":" + minutes + " " + suffix + "</b>"); 
</script> 

đầu ra Id

11:51 AM

0

khuyên bạn sử dụng thời gian máy chủ. Ví dụ: chức năng time(). Nếu bạn căn cứ mọi thứ khỏi giá trị này, thì hệ thống của bạn sẽ an toàn từ bất kỳ hoạt động cụ thể nào mà bạn cần.

Mỗi lần người dùng yêu cầu trang có hoặc sử dụng các giới hạn thời gian, hãy đảm bảo bạn gửi thời gian máy chủ.

Tạo mô-đun Javascript, khi tải trang, kiểm tra xem máy chủ có gửi thời gian hay không, và nếu như vậy đọc giá trị và chuyển đổi thành thời gian địa phương JS, sử dụng múi giờ được tìm nạp hoặc tính thời gian JS. Sau đó, bạn có thể lưu nó như là một JS toàn cầu hoặc slam nó như là một var tĩnh trong một đối tượng hoặc một cái gì đó.

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