2013-02-14 61 views
21

im bằng cách sử dụng php 5.4.6 và MySQL 5.5.29 và tôi gặp sự cố bằng cách chuyển đổi dấu thời gian UNIX thành MYSQL DATETIME và ngược lại. Mysql và php wun trên cùng một máy cục bộ.PHP-MYSQL: Chuyển đổi dấu thời gian Unix sang DateTime và ngược lại

Tôi có một bảng mysql đơn giản

CREATE TABLE Entry(
id SERIAL PRIMARY KEY, 
created DATETIME NOT NULL); 

Để chèn dữ liệu tôi sử dụng php PDO và mysql NOW(). Điều này hoạt động tốt, datetime chính xác được lưu trữ trong cơ sở dữ liệu.

Kế hoạch của tôi là làm việc với dấu thời gian unix ở phía máy khách (php & mysql ở phía máy chủ).

Vì vậy, tôi muốn phân phối dấu thời gian unix cho khách hàng của mình. Vì vậy, tôi sử dụng hàm MySql UNIX_TIMESTAMP() để chuyển đổi trực tiếp trong truy vấn.

Vì vậy, một truy vấn mẫu trông như thế này:

SELECT created, UNIX_TIMESTAMP(created) AS TS FROM Entry 

Kết quả: tạo = 2013/02/14 20:47:35 TS = 1360871255

Vì vậy, bây giờ tôi muốn làm theo cách khác, tôi vượt qua Dấu thời gian UNIX và muốn so sánh nó với Mục nhập trong Cơ sở dữ liệu của tôi. Unfortunetly Im không thể viết một kịch bản PHP hoạt động. Tôi không biết tại sao, nhưng khi tôi đang đi qua các dấu thời gian như nhau (1360871255) để PHP Tôi không nhận được 2013/2/14 20:47:35 với phương pháp này:

public static function toDateTime($unixTimestamp){ 
    return date("Y-m-d H:m:s", $unixTimestamp); 
} 

Khi tôi gọi toDateTime (1360871255) sẽ trở lại 2013-02-14 20:02:35 không phải là DateTime gốc.

Tôi biết, tôi không cần phải định dạng 1360871255 thành Y-m-d H: m: s để sử dụng trong MYSQL, nhưng 1360871255 có vẻ không phải là thời gian tôi mong đợi (và MYSQL UNIX_TIMESTAMP đã trả về).

Những gì tôi muốn làm là một truy vấn đơn giản mà chỉ cho tôi Entries đó lớn tuổi hơn một dấu thời gian nhất định, một cái gì đó đơn giản như thế này:

SELECT * FROM Entry WHERE created < 1360871255 

nhưng như tôi đã đề cập trước đó, các kết quả truy vấn không phải là dự kiến , bởi vì 1360871255 dường như không phải là thời điểm chính xác.

Tôi không chỉ định múi giờ đặc biệt cho kết nối mysql bằng php.

Mọi đề xuất?

Trả lời

36

date format của bạn là sai ... i là phút, không phải m (tháng).

return date("Y-m-d H:i:s", $unixTimestamp); 

Một vài phụ lưu ý:

  • Không cần để tái assign, ví dụ: $unixTimestamp = $unixTimestamp;
  • Vì bạn đang sử dụng PHP> 5.3. bạn có thể quan tâm đến đối tượng DateTime mới.
+1

Chết tiệt, quyền của bạn ... omg ... im thật ngu ngốc – sockeqwe

+3

@sockeqwe - Bạn không ngu ngốc. Bạn chỉ cần nhìn qua nó. Nó xảy ra. – Greeso

3

Vấn đề nằm trong hàm bạn đã viết:

return date("Y-m-d H:m:s", $unixTimestamp); 

Bạn chỉ rõ tháng (m) trong cả ngày và thời gian các phần. Bạn nên thay thế số m thứ hai bằng i, cờ chính xác cho giờ khi sử dụng ngày() bằng PHP.

return date("Y-m-d H:i:s", $unixTimestamp); 

Tùy thuộc vào nhu cầu của bạn, bạn có thể tìm thấy hàm strtotime() đủ hữu ích.

0
function format_date($str) { 
    $month = array(" ", "Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"); 
    $y = explode(' ', $str); 
    $x = explode('-', $y[0]); 
    $date = "";  
    $m = (int)$x[1]; 
    $m = $month[$m]; 
    $st = array(1, 21, 31); 
    $nd = array(2, 22); 
    $rd = array(3, 23); 
    if(in_array($x[2], $st)) { 
      $date = $x[2].'st'; 
    } 
    else if(in_array($x[2], $nd)) { 
      $date .= $x[2].'nd'; 
    } 
    else if(in_array($x[2], $rd)) { 
      $date .= $x[2].'rd'; 
    } 
    else { 
      $date .= $x[2].'th'; 
    } 
    $date .= ' ' . $m . ', ' . $x[0]; 

    return $date; 
} 
0

không có cả hai. bạn nên lưu dấu thời gian dưới dạng INT hoặc BIGINT vì nếu bạn sử dụng định dạng TIMESTAMP của mysql, bạn sẽ không bao giờ lấy lại dấu thời gian đó cho một số int. Bạn chỉ có thể nhận được một cái gì đó như thế này 1970-01-01 01:00:00.

1

Tại sao không chỉ đơn giản sử dụng hàm FROM_UNIXTIME trong mysql?

+0

Ngôn ngữ SQL hút và do đó, sử dụng các phần mở rộng MySQL, đặc biệt là các phần mở rộng từ các phiên bản gần đây. Và nó dễ dàng hơn và đẹp hơn để làm việc với một ngôn ngữ lập trình thực tế hơn là một ngôn ngữ meta không phù hợp với phần còn lại của ứng dụng. – Deji

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