Tôi nghi ngờ vấn đề phải làm với một số sắc thái của strtotime()
.
strtotime()
có thể lấy bất kỳ chuỗi nào và chuyển đổi nó thành dấu thời gian Unix. Vấn đề là khi chuỗi không chứa múi giờ rõ ràng, nó sẽ sử dụng những gì được đặt bởi date_default_timezone_get()
. Tuy nhiên, điều đó nên được đặt từ người dùng hiện tại (nó được đặt bởi proxy tài khoản). Tuy nhiên, chuỗi mà bạn đang rút ra $node->field_date->value
hoàn toàn nằm trong UTC. Nói cách khác, tôi nghĩ rằng chuỗi đang được phân tích cú pháp bằng cách strtotime()
được hiểu như trong 'America / New_York' chứ không phải 'UTC'.
Tin tốt là bạn có thể đơn giản hóa tình huống của mình rất nhiều. Mục trường cho phạm vi ngày bao gồm bốn phần
- 'value' là ngày bắt đầu dưới dạng chuỗi trong UTC
- 'start_date' là một đối tượng DrupalDateTime đại diện cho 'giá trị'
- 'end_value' là ngày kết thúc dưới dạng chuỗi trong UTC
- 'end_date' là một đối tượng DrupalDateTime đại diện cho 'end_value'
Đối với trường thời gian ngày đơn giản, chúng là
- 'value' là ngày dưới dạng chuỗi trong UTC
- 'ngày' là một đối tượng DrupalDateTime đại diện cho 'giá trị'
Vì vậy, bạn có thể làm việc với DrupalDateTime()
đối tượng trực tiếp. Ngoài ra, date.formatter
dịch vụ đó sẽ kéo theo múi giờ thích hợp được sử dụng bởi người dùng đang xem trang theo mặc định (ngoài việc sử dụng ngôn ngữ hoạt động của người dùng).
Tôi nghi ngờ một cái gì đó như thế này sẽ làm việc
$node = Node::load(2100);
$start_date = $node->field_date->start_date;
$formatted = \Drupal::service('date.formatter')->format(
$start_date->getTimestamp(), 'custom', 'Y-m-d H:i:s P'
);
Lưu ý Tôi đã thêm trình giữ chỗ định dạng 'P' trong đó để bạn có thể thấy múi giờ mà hệ thống nghĩ là đang sử dụng.
Đảm bảo rằng bạn có múi giờ thích hợp được thiết lập trên admin / config / khu vực / cài đặt và múi giờ người dùng của bạn là những gì bạn đang mong đợi. Đồng thời đảm bảo rằng bạn có múi giờ thích hợp được đặt trong php.ini (đó là date.timezone
cài đặt); những điều kỳ lạ xảy ra khi điều này không được đặt (Và ngoài đỉnh đầu, tôi không nhớ nếu điều đó gây ra cảnh báo trong trình cài đặt hoặc trên báo cáo trạng thái khi không được đặt. Tôi nhớ vấn đề, nhưng không biết nó có cam kết).
date
tính năng truy cập DrupalDateTime. Vì tò mò làm thế nào bạn tìm ra điều này? Tôi đã có thể nhận ra rằng lĩnh vực của tôi thuộc loạiDateTimeItem
nhưng trong đó có vẻ không rõ ràng rằng có mộtdate
(hoặcvalue
) thành viên công khai cho lớp đó.