2012-02-06 45 views
5

Tôi muốn biết liệu có cách nào để bù đắp múi giờ cho một phạm vi ngày nhất định giữa hai múi giờ trong một thời hạn nhất định không.Nhận chênh lệch múi giờ giữa hai múi giờ trong một thời hạn nhất định

getTimezoneOffset(startDate,endDate,timezone1,timezone2){ 
    ...missing magic to go here... 
} 

phải trả lại khoảng thời gian có hiệu lực trong một khoảng thời gian nhất định. Tuy nhiên, nếu thay đổi bù trừ, nó sẽ trả về phạm vi ngày mà nó hợp lệ.

Vì vậy, tôi nhìn vào một cái gì đó như thế này:

getTimezoneOFfset("march 9 12 am", "march 15 12 am", "UTC", "US/NEW_YORK") 

giá trị trả về một cái gì đó như thế này

timezoneoffset[0]["range"]=[march 9 12am to march 11 2 am] 
timezoneoffset[0]["offset"]=5 
timezoneoffset[1]["range"]=[march 9 2 am to march 15 12 am] 
timezoneoffset[1]["offset"]=4 

Tôi chỉ không muốn để tính toán bù đắp múi giờ cho mỗi mục dự kiến ​​cho phạm vi nhất định . Đã được tìm kiếm nếu có một số cách để có được một tra cứu trực tiếp cho offsets nếu nó sẽ thay đổi.

Tôi đang làm việc với PHP, nhưng giải pháp bằng bất kỳ ngôn ngữ nào sẽ được đánh giá cao.

Giải pháp MySQL cũng sẽ hoạt động vì nó sẽ được tối ưu hóa hơn để thực hiện việc này trong MySQL.

Trả lời

3

Giả sử bạn có phiên bản php mới hơn (5.2.0+) lớp DateTimeZone là một phần của lõi PHP và sẽ cho phép bạn sử dụng hàm getOffset() để thực hiện các tính toán này. Nó sẽ cho phép bạn vượt qua trong một dateTime object và chỉ định một múi giờ. Nếu bạn làm điều này cho cả hai ngày của bạn, bạn sẽ có thể tính toán tất cả các mảnh bạn đang tìm kiếm để lấy. Để sử dụng một ví dụ từ php.net:

// Create two timezone objects, one for Taipei (Taiwan) and one for 
// Tokyo (Japan) 
$dateTimeZoneTaipei = new DateTimeZone("Asia/Taipei"); 
$dateTimeZoneJapan = new DateTimeZone("Asia/Tokyo"); 

// Create two DateTime objects that will contain the same Unix timestamp, but 
// have different timezones attached to them. 
$dateTimeTaipei = new DateTime(mktime([the date in question]), $dateTimeZoneTaipei); 
$dateTimeJapan = new DateTime(mktime([the date in question]), $dateTimeZoneJapan); 


// Calculate the GMT offset for the date/time contained in the $dateTimeTaipei 
// object, but using the timezone rules as defined for Tokyo 
// ($dateTimeZoneJapan). 
$timeOffset = $dateTimeZoneJapan->getOffset($dateTimeTaipei); 

// Should show int(32400) (for dates after Sat Sep 8 01:00:00 1951 JST). 
print("Number of seconds Japan is ahead of GMT at the specific time: "); 
var_dump($timeOffset); 

print("<br />Number of seconds Taipei is ahead of GMT at the specific time: "); 
var_dump($dateTimeZoneTaipei->getOffset($dateTimeTaipei)); 

print("<br />Number of seconds Japan is ahead of Taipei at the specific time: "); 
var_dump($dateTimeZoneJapan->getOffset($dateTimeTaipei) 
    -$dateTimeZoneTaipei->getOffset($dateTimeTaipei)); 
+0

Tôi biết về việc bù đắp .. nhưng có được bù đắp chỉ cung cấp cho u bù đắp cho một thời gian nhất định .. điều là tôi có một lịch trình với lịch trình các mục lịch trình cho các thời điểm khác nhau trong ngày .. – user1192612

+0

Vì vậy, nếu tôi nhận được yêu cầu để có được lịch trình các mặt hàng giữa 10 tháng ba 2012 9 pm tom 11 tháng ba 9 am bù đắp sẽ thay đổi cho thời gian tht .. Tôi không wnat để tính toán offsets cho mọi thời gian .. Và điều này chỉ dành cho Hoa Kỳ .. các quốc gia khác nhau sẽ có khác nhau ngày khi thay đổi bù đắp, .. và tôi đang cố gắng để tìm các offet giữa hai múi giờ cho một tập hợp thời gian không nhất thiết phải UTC .. vấn đề là tôi donno nếu tôi tính toán bù đắp dựa trên thời gian bắt đầu nó sẽ giống nhau trong suốt ..Tôi nghĩ rằng PHP có được bù đắp ggives u bù đắp cho một thời gian nhất định .. Tôi hy vọng tôi đã làm cho bản thân mình rõ ràng – user1192612

+0

Bottomline là tôi phải giả định sự bù đắp có thể khác nhau trong một ngày nói diễu 11 12 am t o mrach 11 12 pm (bù đắp thay đổi lúc 2 giờ sáng) .. Tôi đang cố gắng để trang trải trường hợp góc này – user1192612

1

Tôi nghĩ rằng PHP DateTimeZone::getTransitions method có thể giúp bạn có được ở đó. Nó có một bí danh thủ tục, timezone_transitions_get().

public array DateTimeZone::getTransitions (
    [ int $timestamp_begin [, int $timestamp_end ]] ) 

Phương thức này trả về tất cả "chuyển tiếp" từ một giá trị chênh lệch múi giờ này sang múi giờ khác, trong một khoảng thời gian nhất định.

Vì mục đích của bạn, bạn sẽ muốn tạo DateTimeZone đối tượng cho từng múi giờ, gọi DateTimeZone::getTransitions cho phạm vi ngày của bạn để nhận một loạt chuyển tiếp cho múi giờ đó, sau đó hợp nhất và sắp xếp hai mảng chuyển tiếp. Điều này sẽ cho bạn tương đương với mảng timezoneoffset[] mà bạn tìm kiếm.

Cái gì như:

getTimezoneOffset(startDate,endDate,timezone1,timezone2){ 
    DT1 = DateTimeZone(timezone1); 
    transitions1 = DT1->getTransitions(startDate,endDate); 
    DT2 = DateTimeZone(timezone2); 
    transitions1 = DT2->getTransitions(startDate,endDate); 
    timezoneoffset[] = // merge and sort (transitions1, transitions2) 
} 

Định dạng của mảng chuyển tiếp cũng không phải là tài liệu. Tài liệu phương pháp cho thấy một số mục Ví dụ:

Array 
(
... 
    [1] => Array 
     (
      [ts] => -1691964000 
      [time] => 1916-05-21T02:00:00+0000 
      [offset] => 3600 
      [isdst] => 1 
      [abbr] => BST 
     ) 

    [2] => Array 
     (
      [ts] => -1680472800 
      [time] => 1916-10-01T02:00:00+0000 
      [offset] => 0 
      [isdst] => 
      [abbr] => GMT 
     ) 
    ... 
) 

Tôi suy đoán rằng: ts đề cập đến một timestamp PHP trong kỷ nguyên giây, như được trả về bởi time(), đưa ra ngay lập tức trong thời gian mà thay đổi bù với giá trị trong hồ sơ này . time đề cập đến cùng một tức thời, dưới dạng ngày giờ chuỗi được định dạng. offset là chênh lệch múi giờ tính bằng giây từ UTC, ngay lập tức time/ts, chuyển tiếp sang bước chuyển tiếp tiếp theo. isdst là 1 nếu bù đắp đề cập đến thời gian bù trừ ánh sáng ban ngày, 0 nếu không. abbr là viết tắt của chuỗi cho múi giờ.Nếu bất kỳ ai có thông tin chắc chắn về cấu trúc dữ liệu này, sẽ là một lòng tốt khi thêm nó vào the documentation.

+0

Cảm ơn Jim ..Đó chính xác những gì tôi đang tìm kiếm .. Tôi đã đi qua đối tượng datetime nhưng điều này đã bị bỏ qua. – user1192612

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