Tôi có một dấu thời gian unix như thế này:
$timestamp=1330581600
Làm thế nào để tôi có được sự khởi đầu của ngày và cuối ngày cho dấu thời gian đó?
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
Tôi đã thử điều này:
$endOfDay = $timestamp + [60 * 60 * 23];
Nhưng tôi không nghĩ rằng nó sẽ hoạt động vì bản thân dấu thời gian không phải là chính xác đầu ngày.
Jonik
78.6K70 Huy hiệu vàng257 Huy hiệu bạc367 Huy hiệu đồng70 gold badges257 silver badges367 bronze badges
Hỏi ngày 17 tháng 4 năm 2012 lúc 19:33Apr 17, 2012 at 19:33
2
Strtotime có thể được sử dụng để nhanh chóng cắt giảm giờ/phút/giây
$beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
DateTime cũng có thể được sử dụng, mặc dù yêu cầu thêm một vài bước để có được từ một thời gian dài
$dtNow = new DateTime[];
// Set a non-default timezone if needed
$dtNow->setTimezone[new DateTimeZone['Pacific/Chatham']];
$dtNow->setTimestamp[$timestamp];
$beginOfDay = clone $dtNow;
$beginOfDay->modify['today'];
$endOfDay = clone $beginOfDay;
$endOfDay->modify['tomorrow'];
// adjust from the start of next day to the end of the day,
// per original question
// Decremented the second as a long timestamp rather than the
// DateTime object, due to oddities around modifying
// into skipped hours of day-lights-saving.
$endOfDateTimestamp = $endOfDay->getTimestamp[];
$endOfDay->setTimestamp[$endOfDateTimestamp - 1];
var_dump[
array[
'time ' => $dtNow->format['Y-m-d H:i:s e'],
'start' => $beginOfDay->format['Y-m-d H:i:s e'],
'end ' => $endOfDay->format['Y-m-d H:i:s e'],
]
];
Với việc bổ sung thời gian kéo dài trong PHP7, có khả năng bỏ lỡ một giây nếu sử dụng kiểm tra
$endOfDay = $timestamp + [60 * 60 * 23];
4 với điều này. Sử dụng kiểm tra $endOfDay = $timestamp + [60 * 60 * 23];
5 sẽ tránh được khoảng cách đó, ngoài những điều kỳ lạ xung quanh việc trừ đi giây và tiết kiệm ánh sáng ban ngày trong xử lý thời gian của PHP.Đã trả lời ngày 17 tháng 4 năm 2012 lúc 19:39Apr 17, 2012 at 19:39
Rrehbeinrrehbeinrrehbein
4.0901 Huy hiệu vàng17 Huy hiệu bạc23 Huy hiệu đồng1 gold badge17 silver badges23 bronze badges
8
Chỉ là DateTime
$beginOfDay = DateTime::createFromFormat['Y-m-d H:i:s', [new DateTime[]]->setTimestamp[$timestamp]->format['Y-m-d 00:00:00']]->getTimestamp[];
$endOfDay = DateTime::createFromFormat['Y-m-d H:i:s', [new DateTime[]]->setTimestamp[$timestamp]->format['Y-m-d 23:59:59']]->getTimestamp[];
Đầu tiên một đối tượng DateTime được tạo và dấu thời gian được đặt thành dấu thời gian mong muốn. Sau đó, đối tượng được định dạng dưới dạng chuỗi cài đặt giờ/phút/giây đến đầu hoặc cuối ngày. Cuối cùng, một đối tượng DateTime mới được tạo từ chuỗi này và dấu thời gian được truy xuất.
Có thể đọc được
$dateTimeObject = new DateTime[];
$dateTimeObject->setTimestamp[$timestamp];
$beginOfDayString = $dateTimeObject->format['Y-m-d 00:00:00'];
$beginOfDayObject = DateTime::createFromFormat['Y-m-d H:i:s', $beginOfDayString];
$beginOfDay = $beginOfDayObject->getTimestamp[];
Chúng ta có thể kết thúc ngày một cách thay thế bằng cách sử dụng phiên bản dài hơn này:
$endOfDayObject = clone $beginOfDayOject[]; // Cloning because add[] and sub[] modify the object
$endOfDayObject->add[new DateInterval['P1D']]->sub[new DateInterval['PT1S']];
$endOfDay = $endOfDayOject->getTimestamp[];
Múi giờ
Timezone cũng có thể được đặt bằng cách thêm chỉ báo dấu thời gian vào định dạng như
$endOfDay = $timestamp + [60 * 60 * 23];
6 và chỉ định dấu thời gian sau khi tạo đối tượng DateTime:$beginOfDay = DateTime::createFromFormat['Y-m-d H:i:s O', [new DateTime[]]->setTimezone[new DateTimeZone['America/Los_Angeles']]->setTimestamp[$timestamp]->format['Y-m-d 00:00:00 O']]->getTimestamp[];
Tính linh hoạt của DateTime
Chúng tôi cũng có thể nhận được thông tin khác như đầu/cuối tháng hoặc đầu/kết thúc giờ bằng cách thay đổi định dạng thứ hai được chỉ định. Trong tháng:
$endOfDay = $timestamp + [60 * 60 * 23];
7 và $endOfDay = $timestamp + [60 * 60 * 23];
8. Trong giờ: $endOfDay = $timestamp + [60 * 60 * 23];
9 và $beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
0Sử dụng các định dạng khác nhau kết hợp với các đối tượng add []/sub [] và dateInterval, chúng ta có thể có được sự khởi đầu hoặc kết thúc của bất kỳ giai đoạn nào, mặc dù một số sự quan tâm sẽ cần được thực hiện để xử lý chính xác các năm nhảy.
Liên kết liên quan
Từ các tài liệu PHP:
- Ngày giờ
- Ngày với thông tin về định dạng
- Datetimezone
- Ngày
Đã trả lời ngày 4 tháng 1 năm 2016 lúc 18:07Jan 4, 2016 at 18:07
3
Bạn có thể sử dụng kết hợp
$beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
1 và $beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
2:list[$y,$m,$d] = explode['-', date['Y-m-d', $ts]];
$start = mktime[0,0,0,$m,$d,$y];
$end = mktime[0,0,0,$m,$d+1,$y];
$beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
2 đủ thông minh để bọc tháng/năm khi được cho một ngày ngoài tháng được chỉ định [ngày 32 tháng 1 sẽ là ngày 1 tháng 2, v.v.]Đã trả lời ngày 17 tháng 4 năm 2012 lúc 19:38Apr 17, 2012 at 19:38
Tính toánCal
7.03724 Huy hiệu bạc28 Huy hiệu đồng24 silver badges28 bronze badges
Bạn có thể chuyển đổi thời gian sang dữ liệu hiện tại và sau đó sử dụng hàm strtotime để tìm sự khởi đầu của ngày và chỉ cần thêm 24 giờ vào đó để tìm kết thúc ngày.
Bạn cũng có thể sử dụng toán tử còn lại [%] để tìm ngày gần nhất. Ví dụ:
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
0Đã trả lời ngày 17 tháng 4 năm 2012 lúc 19:36Apr 17, 2012 at 19:36
CameroncameronCameron
9901 Huy hiệu vàng9 Huy hiệu bạc 20 Huy hiệu đồng1 gold badge9 silver badges20 bronze badges
3
Câu trả lời được chấp nhận không may bị phá vỡ do lỗi PHP xảy ra trong các tình huống rất cụ thể. Tôi sẽ thảo luận về những kịch bản đó, nhưng trước tiên là câu trả lời bằng cách sử dụng DateTime. Sự khác biệt duy nhất giữa câu trả lời này và câu trả lời được chấp nhận xảy ra sau dòng
$beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
4:e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
1Vì vậy, bạn sẽ lưu ý rằng thay vì sử dụng
$beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
5, thay vào đó, chúng tôi có được dấu thời gian và trừ đi. Câu trả lời được chấp nhận bằng cách sử dụng $beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
6 nên hoạt động, nhưng bị phá vỡ vì lỗi PHP trong các kịch bản rất cụ thể. Lỗi này xảy ra trong múi giờ thay đổi tiết kiệm ánh sáng ban ngày vào lúc nửa đêm, vào ngày trong năm mà đồng hồ được di chuyển "về phía trước". Dưới đây là một ví dụ bạn có thể sử dụng để xác minh lỗi đó.Mã ví dụ lỗi
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
2Đầu ra mã ví dụ lỗi
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
3Đã trả lời ngày 18 tháng 10 năm 2019 lúc 14:41Oct 18, 2019 at 14:41
KayakinkoderkayakinkoderKayakinKoder
2.9273 Huy hiệu vàng20 Huy hiệu bạc35 Huy hiệu Đồng3 gold badges20 silver badges35 bronze badges
Hôm nay thời gian bắt đầu ngày. Giản dị
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
4Đã trả lời ngày 19 tháng 5 năm 2016 lúc 6:56May 19, 2016 at 6:56
GaneshganeshGanesh
Huy hiệu bạc 11411 silver badge9 bronze badges
1
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
5Nếu bạn cần cả hai giá trị trong cùng một tập lệnh. Nó nhanh hơn đến +/- 86400 giây cho một trong các biến hơn là bắn cả sàn và trần. Ví dụ:
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
6Đã trả lời ngày 22 tháng 3 năm 2016 lúc 22:56Mar 22, 2016 at 22:56
KareemkareemKareem
4.73540 Huy hiệu bạc36 Huy hiệu đồng40 silver badges36 bronze badges
Đối với bất kỳ ai có câu hỏi này trong tương lai:
Bất kỳ mã ngày nào
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
7Mã ngày hiện tại
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
8Đã trả lời ngày 30 tháng 3 năm 2015 lúc 9:29Mar 30, 2015 at 9:29
e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day
9Đã trả lời ngày 29 tháng 4 năm 2021 lúc 13:39Apr 29, 2021 at 13:39
0$endOfDay = $timestamp + [60 * 60 * 23];
Điều này làm việc cho tôi :]
Đã trả lời ngày 17 tháng 5 năm 2021 lúc 13:21May 17, 2021 at 13:21
Một chút muộn cho bữa tiệc, nhưng đây là một cách dễ dàng khác để đạt được những gì bạn đang tìm kiếm:
$endOfDay = $timestamp + [60 * 60 * 23];
1Cá nhân tôi sẽ tránh sử dụng cuối ngày trừ khi nó hoàn toàn cần thiết. Tất nhiên, bạn có thể sử dụng
$beginOfDay = strtotime["today", $timestamp];
$endOfDay = strtotime["tomorrow", $beginOfDay] - 1;
7 nhưng đây không phải là cuối ngày thực tế [vẫn còn 1 giây còn lại]. Những gì tôi làm là sử dụng bắt đầu vào ngày hôm sau làm ranh giới kết thúc của tôi, ví dụ:$endOfDay = $timestamp + [60 * 60 * 23];
2Nếu tôi phải sử dụng cuối ngày, tôi sẽ tính toán bắt đầu vào ngày hôm sau và sau đó trừ đi 1 micro giây từ đó.microsecond from that.
Tyler2P
2.28116 Huy hiệu vàng20 Huy hiệu bạc29 Huy hiệu đồng16 gold badges20 silver badges29 bronze badges
Đã trả lời ngày 9 tháng 11 năm 2021 lúc 15:55Nov 9, 2021 at 15:55
$endOfDay = $timestamp + [60 * 60 * 23];
3Bạn có thể đặt múi giờ bằng cách thay thế "Châu Á/Tehran". Một ngày là 86400 giây, đừng hỏi tôi tại sao 86399, đó là một lời thì thầm trong tâm trí tôi nói rằng đó là 86399, vì vậy tôi thậm chí không muốn nghĩ về sự thật của nó.
Đã trả lời ngày 18 tháng 2 lúc 20:47Feb 18 at 20:47
Bọt Amir choAmir Fo
4.5141 Huy hiệu vàng39 Huy hiệu bạc46 Huy hiệu đồng1 gold badge39 silver badges46 bronze badges