2010-10-17 46 views
17

Đó là một câu hỏi ngớ ngẩn, nhưng giá trị INT tối đa là time() và ngày tương lai là gì, ví dụ:Thời gian tối đa() | PHP

1 Tháng một 2999

Would thời gian() bao giờ có được giá trị đó? Đi cho một giá trị time() lớn sẽ trở lại này:

Thu 01 tháng 1 1970 01:00

Một ngày int bình thường

1287320788 - đầu ra hiện nay ngày: Sun 17 tháng 10 2010 2 : 06PM

Nhưng tôi chỉ tò mò về ngày tháng lớn nhất và ngày cuối cùng.

+2

Đối với MySQL, xem thêm http://stackoverflow.com/questions/2012589/ php-mysql-year-2038-bug-what-is-it-how-to-giải quyết-nó – Wrikken

+0

Liên kết đó cũng có thông tin cơ bản tốt về phía PHP –

+0

Điều đó đã được sửa gần đây trong PHP 'time() 'chưa? Giá trị lớn nhất mà nó có thể thực hiện cho một ngày giờ là '9223372036854772207' (' 04.12.292277026596 15: 30: 07') (rất gần với giá trị tối đa 64 bit Integer) –

Trả lời

33

Dấu thời gian tích phân 32 bit cuối cùng sẽ đạt đến ngày 19 tháng 1 năm 2038. Đây được gọi là Year 2038 problem.

+0

Cảm ơn Pekka này. Điều này có bao giờ được giải quyết khi chúng ta gần đạt tới nó không? – MacMac

+0

@YouBook nếu PHP vẫn tồn tại sau đó, có thể. Nó sẽ được dễ dàng để sửa chữa bằng cách chuyển đổi hệ thống cơ bản để INTs lớn hơn - Sẽ không được nhiều của một vấn đề nhờ đánh máy yếu của PHP. Ngoài ra, sử dụng 'DateTime' theo đề xuất của Gordon –

+0

Về cơ bản, vấn đề sẽ tự giải quyết theo định nghĩa từ năm 2038 là max int trong hệ thống 32 bit và hầu hết các máy tính đã 64 bit, có nghĩa là waaaay nhiều hơn về số nguyên ... – Moby04

29

cửa hàng PHP số nguyên lớn nhất nó có thể đại diện trong PHP_INT_MAX liên tục:

date('Y-m-d H:i:s', PHP_INT_MAX); // 2038-01-19 04:14:07 

Nếu bạn muốn làm việc với các ngày vượt ra ngoài đó, hãy xem xét sử dụng DateTime API, ví dụ

$dt = new DateTime('1st January 2999'); 
$dt->add(DateInterval::createFromDateString('+1 day')); 
echo $dt->format('Y-m-d H:i:s'); // 2999-01-02 00:00:00 
echo $dt->format('U');   // 32472226800 
+1

Yup, sử dụng 'DateTime' và - ở phía mySQL - kiểu trường' DATETIME' sửa vấn đề hoàn toàn. –

4

Hãy nhớ rằng sự cố Y2038 không áp dụng trên hệ thống 64 bit.

+4

Mmm, bạn có chắc không? Việc xử lý nội bộ các số nguyên của PHP có tự động chuyển sang 64 bit không? –

+0

Tôi không chắc chắn, nhưng có vẻ như để cuộn qua trên hộp của tôi ... :-) – oglgo

+4

64-bit sẽ không sao cho ~ 300 tỷ năm tới. – Jonah

0

DateTime dường như cũng sử dụng 32 bit trên các máy chủ 64 bit. Vì vậy, bạn gặp rắc rối.

Tôi đã giải quyết nó theo cách này:

new DateTime("99999/12/31 00:00:00"); 

Bởi vì, ngày tràn độ dài tối đa cho DateTime, ngày sử dụng giá trị tối đa possibel và trả về một DateTime đối tượng như thế này (kiểm tra với var_dump):

object(DateTime)#9 (3) { ["date"]=> string(19) "2031-09-12 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" } } 

Tôi không chắc liệu nó có khác với phiên bản PHP hay không. Tôi đã thử nghiệm nó với phiên bản 5.4.

1

Con đường ngắn nhất tôi biết là để có được ngày mai:

ngày ("Ynj", strtotime ("+ 1 ngày"))

date("Y-n-j", PHP_INT_MAX) trên 64bit-hệ thống cung cấp cho tiềm năng nguy hiểm giá trị: 292277026596-12-4

0

Trên nền tảng 64 bit PHP_INT_MAX không phản ánh giá trị INT tối đa cho nền tảng 32 bit.Dưới đây là làm thế nào để có được nó:

$max32bitInt = PHP_INT_SIZE == 4 ? PHP_INT_MAX : PHP_INT_MAX>>32; 

Nếu bạn luôn sử dụng nền tảng 64-bit, chỉ cần sử dụng:

PHP_INT_MAX>>32 
Các vấn đề liên quan