Thay vì loay hoay với múi giờ, tại sao không làm
ALTER TABLE `your_table`
CHANGE `date_added` `date_added`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Điều này sẽ thay đổi cột của bạn từ cột DATE đến cột TIMESTAMP , chuyển đổi tất cả các ngày thành dấu thời gian UTC tương ứng của chúng trong quá trình này.
Khi một hàng mới được chèn, nó sẽ sử dụng dấu thời gian hiện tại như một giá trị . Dấu thời gian luôn ở UTC, vì vậy bạn không phải thay đổi múi giờ trên máy chủ MySql của mình, cũng như cung cấp ngày khi chèn một hàng mới.
Nếu bạn không thể hoặc không muốn thay đổi các cột của mình, bạn cũng có thể chỉ cần chọn dấu thời gian qua
SELECT UNIX_TIMESTAMP('date_added') FROM your_table;
Đối với TimeAgo của bạn, sau đó bạn có thể thực hiện
$now = new DateTime;
$dateAdded = new DateTime("@$yourTimestampFromDb");
$dateAdded->setTimezone($now->getTimezone());
$timeSinceAdded = $dateAdded->diff($now);
Khi bạn cung cấp dấu thời gian cho DateTime, nó sẽ luôn sử dụng UTC bất kể múi giờ máy chủ mặc định của bạn là gì. Do đó, bạn phải chuyển đổi $dateAdded
sang múi giờ mặc định (như được hiển thị ở trên) hoặc chuyển đổi $timeSinceAdded
sang UTC.
Để thay đổi dateTime thành múi giờ của người dùng hiện đang truy cập, bạn
- cần có thông tin này trong cơ sở dữ liệu của bạn, ví dụ:bởi vì bạn đang yêu cầu người dùng đã đăng ký cung cấp thông tin này
- hoặc bạn xác định nó trong thời gian chạy, thường bằng cách tra cứu GeoIP trên IP của người dùng đang truy cập hoặc bằng cách gửi Chênh lệch thời gian từ trình duyệt của người dùng.
Trong mọi trường hợp, bạn chỉ cần thay đổi cả DateTimes thành múi giờ đó. Điều này được thực hiện dễ dàng thông qua setTimezone()
.
$timeSinceAdded
sau đó sẽ là một DateInterval
đối tượng, mà bạn có thể sử dụng như thế này
echo $timeSinceAdded->format('%a total days');
Vui lòng tham khảo các liên kết để biết thêm chi tiết, chẳng hạn như về các công cụ sửa đổi định dạng có sẵn.