Những câu trả lời này không tốt. Tôi không biết một cách di động để làm điều đó.
Đối với Linux ở đây là một lựa chọn: https://bojanz.wordpress.com/2014/03/11/detecting-the-system-timezone-php/
Ngày giải pháp khác đang niêm yết có thể không được chính xác như vấn đề là trong Linux và các tiện ích ngày (gnuutils, gnulib) sẽ thừa hưởng cùng một vấn đề.
Nếu tôi đặt múi giờ thành Châu Âu/Berlin và sau đó yêu cầu ngày cho múi giờ, nó sẽ cung cấp cho tôi CET.
Cách để có được những múi giờ trong Linux là như thế này:
#include <time.h>
#include <stdio.h>
extern char *tzname[2];
extern long timezone;
extern int daylight;
void main() {
tzset();
printf(tzname[0]);
}
Vấn đề là các tập tin khu vực này không bao gồm tên của họ, chỉ có danh sách các múi giờ cha mẹ hoặc một cái gì đó như thế.
CET không giống với khu vực Châu Âu/Berlin. Nếu tôi đặt CET vào ngày đó thì có thể tính sai. Đôi khi điều này không quan trọng vì một số quốc gia đã sử dụng một múi giờ trong nhiều thập kỷ nhưng đôi khi nó có thể quan trọng.
Sử dụng zdump đây là một diff giữa CET và Châu Âu/Berlin:
> Fri Mar 31 23:06:31 1893 UTC = Fri Mar 31 23:59:59 1893 LMT isdst=0 gmtoff=3208
> Fri Mar 31 23:06:32 1893 UTC = Sat Apr 1 00:06:32 1893 CET isdst=0 gmtoff=3600
< Sun Sep 16 00:59:59 1945 UTC = Sun Sep 16 02:59:59 1945 CEST isdst=1 gmtoff=7200
< Sun Sep 16 01:00:00 1945 UTC = Sun Sep 16 02:00:00 1945 CET isdst=0 gmtoff=3600
< Sun Apr 3 00:59:59 1977 UTC = Sun Apr 3 01:59:59 1977 CET isdst=0 gmtoff=3600
... SNIP about a dozen ...
< Sun Sep 30 01:00:00 1979 UTC = Sun Sep 30 02:00:00 1979 CET isdst=0 gmtoff=3600
> Wed May 23 23:59:59 1945 UTC = Thu May 24 01:59:59 1945 CEST isdst=1 gmtoff=7200
... SNIP couple dozen...
> Sun Oct 2 01:00:00 1949 UTC = Sun Oct 2 02:00:00 1949 CET isdst=0 gmtoff=3600
Một số thậm chí có thể không quan trọng nếu bạn đang sử dụng một unixtime nhưng bạn có thể thấy rõ ở đây rằng trong những năm 70 một số sẽ . Có thể một vài múi giờ khác với những thay đổi gần đây hơn nhiều sẽ phá vỡ là sử dụng kết quả từ tzset. Đối với nhiều điều này sẽ là một vấn đề rìa nhưng nếu nó có hiệu lực bạn kết quả có khả năng sẽ không được dễ chịu.
Tôi không biết quy ước dành cho cửa sổ hoặc nếu có cùng một vấn đề. Có một ngoại lệ cho vấn đề này. Nếu múi giờ hệ thống của bạn là một múi giờ gốc (như GMT, UTC, CET, vv) thì tôi không nghĩ rằng vấn đề này sẽ xảy ra.
Tuy nhiên câu hỏi của bạn là cuối cùng về MySQL:
SELECT IF(@@global.time_zone = 'SYSTEM', @@global.system_time_zone, @@global.time_zone) AS time_zone;
Nếu nó được thiết lập để hệ thống nó cũng sẽ chịu chung số phận như PHP và tzset. Tôi đã kiểm tra máy chủ của một người bạn và thường có sự khác biệt một giờ vì MySQL chuyển đổi Châu Âu/Luân Đôn sang GMT. GMT không bao gồm BST là nguyên nhân của nhiều vấn đề. MySQL nội bộ có thể là tốt vì nó vẫn sử dụng/etc/localtime sẽ trỏ đến tập tin ngay cả khi MySQL đang báo cáo sai tên nhưng nếu bạn lấy tên sai đó và sử dụng nó để tải múi giờ bằng một thứ khác thì hai có thể không có cùng múi giờ.
Ngay cả khi bạn đã cố gắng đưa DST vào, nó sẽ không phải là một sửa chữa hoàn hảo. Nếu cá thể MySQL của bạn đang sử dụng SYSTEM, bạn có thể muốn xem liệu bạn có thể chuyển đổi ngày từ ngày đó thành UTC (hoặc ngày/giờ PHP) có thể gây đau đớn cho hiệu suất. Về lý thuyết bạn có thể cố gắng phát hiện bạo lực nhưng tôi sẽ không tư vấn cho nó. Bạn cũng có thể thử đặt múi giờ trong biến phiên và MySQL có thể chuyển đổi tự động nhưng cẩn thận để đảm bảo và luôn luôn RTM (nếu điều đó không hoạt động khi sử dụng nguồn).
Bạn muốn thực hiện điều này trên hệ điều hành nào? – alexn