2010-02-15 37 views
8

Các sản, đầy đủ nội dung của tập tin:Đây có phải là lỗi php, hoặc có vấn đề gì với cài đặt múi giờ/PHP của tôi không?

<?php 

error_reporting(E_ALL); 
ini_set(display_errors, 'on'); 

try { 

    //$x = strtotime('blah'); 
    $x = new DateTime('lol'); 

} catch (Exception $e) { 
     echo $e->getMessage(); 
} 

Các constructor DateTime chấp nhận một chuỗi, mà phải ném một ngoại lệ nếu nó không thể phân tích nó. Này chạy tốt trên máy tính địa phương của tôi, nhưng trên một máy chủ từ xa của tôi là ngoại lệ không bị bắt (và một lần nữa, tôi sử dụng try/catch và mã chính xác cùng):

Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct() [function.DateTime---construct]: Failed to parse time string (lol) at position 0 (l): The timezone could not be found in the database' in /var/www/html/site_com/rez/date.php:9 Stack trace: #0 /var/www/html/site_com/rez/date.php(9): DateTime->__construct('lol') #1 {main} thrown in /var/www/html/site_com/rez/date.php on line 9

Cài đặt cho máy chủ từ xa nơi ngoại trừ không bắt:

PHP Version 5.2.5

date date/time support enabled "Olson" Timezone Database Version 2007.9 Timezone Database internal Default timezone America/Chicago

Directive Local Value Master Value date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone no value no value

thiết lập địa phương của tôi mà nó không làm việc:

PHP 5.2.10

date date/time support enabled "Olson" Timezone Database Version 0.system Timezone Database internal Default timezone System/Localtime

Directive Local Value Master Value date.default_latitude 31.7667 31.7667 date.default_longitude 35.2333 35.2333 date.sunrise_zenith 90.583333 90.583333 date.sunset_zenith 90.583333 90.583333 date.timezone no value no value

tại địa phương, nó bắt ngoại lệ và pri nts lỗi. Các date.timezone trên cả hai là không có giá trị.

Có lẽ đó chỉ là múi giờ của hệ thống nội bộ đang tắt? Hộp địa phương của tôi là Ubuntu và từ xa của tôi là CentOS, có lẽ chúng không nhất quán nhưng không nên PHP vẫn bắt được ngoại lệ?

FYI Tôi không thể cập nhật PHP trên hộp điều khiển từ xa vì tôi không có quyền quản trị.

Trả lời

10

Đặt cược của tôi là lỗi PHP. Tôi biết rằng PHP từng có vấn đề với việc bắt các ngoại lệ được ném vào các nhà xây dựng, và điều đó dường như là những gì đang xảy ra ở đây.

Bởi vì nó là một lỗi, lựa chọn của bạn là

  1. Update của máy chủ phiên bản PHP; bạn nói điều này không phải là một lựa chọn
  2. Sử dụng strtotime() để tìm ngày hoặc, nếu bạn cần hoặc muốn truy cập vào các phong cách hướng đối tượng của DateTime, bắt lỗi với strtotime()

Ví dụ:

<?php 

try { 

    if (@strtotime($str) !== false) { 
     $x = new DateTime($str); 
    } else { 
     throw new Exception("Failed to parse string ({$str})"); 
    } 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Bạn thậm chí có thể thử mở rộng lớp DateTime và ghi đè hàm tạo bằng mã ở trên, ngoại trừ thay vì DateTime mới bạn sẽ sử dụng parent :: __ construct() . Hãy nhớ rằng nguyên mẫu phải giống nhau, vì vậy cấu trúc của bạn nên lấy hai tham số (chuỗi $ str, DateTimeZone $ timezone = null).Điều này có lợi ích bổ sung khi xác định liệu lỗi ngoại lệ __construct() có phải là nguồn gốc của các vấn đề của bạn hay không. – Frankie

+0

Vâng tôi hiện đang sử dụng strtotime và đảm bảo nó không bị lỗi, sau đó cho nó vào hàm tạo DateTime - Tôi sẽ thử mở rộng. –

+0

Có thể tái tạo điều này trong PHP 5.5.9ubuntu. – CarstenSchmitz

1

Không chắc về vấn đề chính xác nhưng hãy thử cài đặt múi giờ sử dụng chức năng này:

date_default_timezone_set('Europe/London'); // or whatever timezone 

Và xem nếu công trình này.

+0

Máy chủ không bắt ngoại lệ đã có một bộ (Múi giờ mặc định Mỹ/Chicago). –

+0

vâng tôi đã thử điều này trước đây và nó dường như không làm gì cả. –

+0

đây là một vấn đề lạ sau đó, chúng ta hãy xem giải pháp cho nó là gì – Sarfraz

0

tôi chạy vào vấn đề tương tự, đã có thể sửa chữa với

date('date format', $str); 
date("Y-m-d", $news->created); 

Hy vọng rằng sẽ giúp một ai đó.

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