2011-01-15 36 views
12

Làm cách nào để có được múi giờ của máy chủ cục bộ mà không dựa vào php.ini hoặc các tệp cấu hình khác?Làm cách nào tôi có thể nhận múi giờ của máy chủ địa phương?

Tôi đang tìm một đầu ra tương tự với đầu ra của date('e'). ví dụ. "UTC", "GMT" hoặc "Đại Tây Dương/Azores".

Tôi cần biết điều này để tôi có thể biết múi giờ MySQL.

+0

Bạn muốn thực hiện điều này trên hệ điều hành nào? – alexn

Trả lời

4

Nếu bạn đang ở trên * nix, hãy gọi của hệ thống date sử dụng popen:

popen("date +%Z"); 
+0

Đối với Windows: WMi http://pastebin.com/qhmvEvP0 – user956584

9

Nếu bạn đang sử dụng một nền tảng lưu trữ Linux/Unix dựa, bạn có thể sử dụng đầu ra của lệnh cập nhật với các "lần chữ cái viết tắt khu" định dạng như vậy:

$systemTimeZone = system('date +%Z'); 

Tuy nhiên, cần lưu ý rằng bạn không nên nhất thiết phải dựa trên múi giờ của hệ thống và rằng bạn nên dùng date_default_timezone_set (hoặc date.timezone php.in tôi thiết lập) để đặt múi giờ được yêu cầu.

+0

tôi chỉnh sửa câu hỏi của mình để bạn có thể hiểu những gì tôi muốn làm – dvdx

+0

@dvdx Bạn cần một chuỗi như "America/New York" cho dù thế nào? –

+0

vì America/New York sẽ xuất một trong số MANY trên danh sách các định dạng múi giờ được hỗ trợ tìm thấy tại đây: http://www.php.net/manual/en/timezones.php – SoLoGHoST

1

On linux/unix tôi sử dụng

shell_exec("date +%Z"); 
-1

Bạn không thực sự cần phải biết những gì "múi giờ" MySQL đang chạy trên - bạn chỉ cần phải biết sự khác biệt để UTC.

Để nhận được rằng bạn chỉ có thể yêu cầu MySQL:

SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP, NOW()) 

Kể từ khi giá trị của NOW() được dựa trên múi giờ MySQL đang chạy trên, mà sẽ đọc sự khác biệt giữa NOW() và thời gian UTC, trong giờ. Sau đó, bạn có thể sử dụng giá trị đó để tạo dấu thời gian đầy đủ như 2016-04-15T15:52:01+01:00 có thể được sử dụng trong DateTime::__construct(). Sau đó, bạn có thể để PHP lo lắng về sự khác biệt về múi giờ giữa ứng dụng và máy chủ cơ sở dữ liệu bằng cách so sánh các đối tượng DateTime ... và nên hoạt động trên tất cả các hệ thống.

+0

Điều này không cung cấp múi giờ thực, chỉ hiệu ứng của múi giờ. Một số múi giờ chồng chéo đặc biệt với DST hoặc khi chúng được thay đổi. – jgmjgm

+0

@jgmjgm - điểm công bằng, tôi không tin chắc rằng OP * thực sự * cần thứ gì đó giống như chuỗi 'GMT' nếu bạn hiểu ý tôi ... bạn không cần nó cho bất kỳ loại phép tính nào mà nó chỉ mang lại cho bạn một chuỗi dễ đọc hơn. Tôi nghĩ rằng tôi đã cố gắng để cung cấp một giải pháp thay thế cho những gì tôi nghi ngờ vấn đề cơ bản hơn là thực sự trả lời câu hỏi "as-was" ... nó đã được một thời gian trước đây;) – CD001

-1

bạn có thể nhận múi giờ máy chủ của mình bằng cách này. echo date_default_timezone_get();

0

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).

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