2009-07-14 33 views
12

Tôi có một bảng với giá trị timestamp như:Thêm 13 giờ để một dấu thời gian

 
    2009-07-14 02:00:00 

tôi cần phải hiển thị chúng tại thời gian chạy với 13 giờ gia tăng, như:

 
    2009-07-14 15:00:00 

gì là đơn giản nhất cách để làm điều này trong PHP?

+0

07-14 02:00 đến 07-15 13:00 là 35 giờ, chứ không phải 13. Bạn đếm nó như thế nào? –

+0

ahh oops nó chỉ là một ví dụ .. xấu của tôi! tôi chỉ cần biết cách thêm x giờ vào một dấu thời gian (không phải là thời gian hiện tại)! – aalaap

+0

Nếu ai đó vẫn đang tìm kiếm điều này, cách tốt hơn là phương pháp của Richy B. viz .: '$ date = new DateTime ('2009-07-14 02:00:00'); $ date-> add (new DateInterval ('P13H')); ' – aalaap

Trả lời

1

Tôi biết điều này đã được hỏi một thời gian dài trước đây và tôi đã lựa chọn câu trả lời, nhưng tôi tin rằng điều quan trọng là chỉ người dùng mới theo hướng hiện đại hơn và chính xác, mà đang sử dụng tuyệt vời Carbon thư viện:

>>> Carbon\Carbon::parse('2009-07-14 02:00:00') 
... ->addHours(13) 
... ->format('Y-m-d H:i:s'); 
=> Carbon\Carbon {#869 
    +"date": "2009-07-14 15:00:00.000000", 
    +"timezone_type": 3, 
    +"timezone": "UTC", 
    } 

Carbon không chỉ làm cho nó đơn giản để thực hiện các tính toán yêu cầu, nó cũng khiên bạn chống lại bất kỳ sai lầm tiềm năng bạn có thể làm trong khi tay đang cố gắng làm điều tương tự.

Vỏ trong ví dụ đầu ra ở trên là Laravel Tinker. Laravel tàu với Carbon, do đó, tuyên bố trên hoạt động out-of-the-box. Nếu bạn không sử dụng một khung công tác PHP hiện đại, bạn nên như vậy. Thật dễ dàng để thêm Carbon vào nó.

1

bạn có thể sử dụng http://de3.php.net/manual/en/function.strptime.php để chuyển đổi thành dấu thời gian unix. Sau đó, bạn có thể dễ dàng thêm 13 * 60 * 60 vào đó và sử dụng http://de3.php.net/manual/en/function.date.php để chuyển đổi lại dấu thời gian theo ý muốn.

cách khác sẽ được thông qua phát nổ chức năng, nhưng tôi nghĩ rằng điều này có thể phức tạp hơn bởi vì bạn phải xem xét nếu ngày/tháng/năm thay đổi và các công cụ

+0

vâng tôi không muốn tự làm điều đó trừ khi tôi phải làm vậy. lemme thử phương pháp khác mà bạn đã đề cập. – aalaap

+0

+1, suy nghĩ cho định dạng ngày được đưa ra, strtotime sẽ hoạt động tốt như –

+0

-1, bạn không nên sử dụng số học cơ bản cho các phép tính thời gian. Do Daylight Saving Time, một số lỗi mà tôi lẻn vào.Tôi đã viết về nó: http://igstan.blogspot.com/2008/12/how-not-to-make-dates-in-php.html –

2

Bạn có thể làm việc thêm vì nó đi ra khỏi cơ sở dữ liệu?

SELECT ... DateAdd(hh, 13, DateField) AS DateField 

(SQL Server)

+0

quá tốn kém vào cuối máy chủ, bạn có nghĩ vậy không? – aalaap

+1

IMHO, cái này tốt hơn vì dữ liệu "đúng" ngay sau khi nó trở lại từ truy vấn. Không có cơ hội để làm điều gì khác trên tai nạn hoặc quên chuyển đổi nó. – CaseySoftware

18

Tôi biết rằng

date("Y-M-d H:i:s", strtotime($timestamp_from_array) + 13 * 3600); 

là có mùi, nhưng nó sẽ cung cấp cho bạn một ý tưởng.

strtotime chuyển đổi chuỗi dấu thời gian thành giá trị dấu thời gian, sau đó chúng tôi thêm giờ và chuyển đổi giờ trở lại định dạng dấu thời gian trong mảng bằng hàm date.

Nhưng tôi cho rằng điều bạn thực sự muốn là sử dụng time zones.

Chỉnh sửa: igstan là chính xác, bạn cũng nên nhớ thay đổi thời gian tiết kiệm ánh sáng ban ngày giữa các khoảng bù đó.

+0

bingo! đây chính là nó! – aalaap

15

Có rất nhiều vấn đề với Múi giờ và Giờ tiết kiệm ánh sáng ban ngày khi sử dụng số học cơ bản để tính toán thời gian. Giải pháp tốt nhất là dựa vào các hàm ngày/giờ của PHP, như strtotime() hoặc mktime(). Tôi đã viết về DST problems on my blog.

echo date('Y-M-d H:i:s', strtotime('2009-07-14 02:00:00 + 13 hours')); 
1

Bạn có bảng có dấu thời gian?Nếu đó là một cơ sở dữ liệu MySQL, bạn chỉ có thể làm điều này trong cơ sở dữ liệu sử dụng addtime: SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002');

Nếu bạn đang sử dụng Zend Framework PHP, bạn có thể làm một cái gì đó như:

$date=new Zend_Date(Array('year'=>$iYear,'month'=>$iMonth,'day'=>$iDay)); 
// changes $date by adding 12 hours 
$date->add('12:00:00', Zend_Date::TIMES); 

Ngoài ra, bạn có thể làm điều đó sử dụng chức năng PHP4 bản địa như: [nhanh hơn kém chính xác hơn,: không tính đến giây nhuận/múi giờ thay đổi vv]

$datestamp=strtotime('2009-07-14 02:00:00'); // It'll probably be better using mktime 
$datestamp=$datestamp+(60*60*13); // 60 seconds times 60 minutes times 13 hours 

hoặc [chậm hơn, chính xác hơn]

$datestamp = strtotime('2009-07-14 02:00:00'); // It'll probably be better using mktime 
    $newDate = date('Y-m-d H:i:S', mktime(date('H',$datestamp)+13, date('i',$datestamp), date('s',$datestamp), date('m',$datestamp), date('d',$datestamp), date('Y',$datestamp))); 

hoặc, nếu bạn đang sử dụng PHP 5 sử dụng Datetime chức năng

$date = new DateTime('2009-07-14 02:00:00'); 
date_add($date, new DateInterval("P13H")); 
0
<?php 
echo date('Y-m-d H:i:s', strtotime('+13 hours', strtotime('2009-07-14 02:00:00'))); 
?> 
-1

Hãy nói rằng bạn đã chọn một lĩnh vực ngày cụ thể từ bảng của bạn được gọi là "datetime_field" từ ID hàng 3000. Nó sẽ đơn giản như thế này!

SELECT *, ADDTIME(`datetime_field`,'0 13:00:00') as new_datetime 
FROM `table_name` 
WHERE id = 3000 

Điều này rõ ràng có thể được sử dụng trong truy vấn cập nhật nếu bạn muốn cập nhật, tất nhiên.

Và cách khác, nếu bạn chỉ thêm 13 giờ (sự khác biệt múi giờ) vào truy vấn. Người ta sẽ sử dụng MySQL NOW() làm thời gian ban đầu và chỉ cần thêm thời gian như trên. Chọn, cập nhật hoặc chèn, đó là tất cả cùng một phương pháp! Nó sẽ là:

SELECT *, NOW() as current_datetime, 
      ADDTIME(NOW(),'0 13:00:00') as new_datetime 
FROM `table_name` 
WHERE id = 3000 

Hãy đơn giản và nhanh chóng!

: o)

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