ได้รับการประทับเวลาสำหรับวันนี้ตอนเที่ยงคืน?


124

ฉันจะไปเกี่ยวกับการประทับเวลาใน php สำหรับวันนี้ตอนเที่ยงคืนได้อย่างไร สมมติว่าเป็นวันจันทร์ 17.00 น. และฉันต้องการให้ประทับเวลาของวันจันทร์ (วันนี้) ตอนเที่ยงคืน (00.00 น.) ซึ่งเกิดขึ้นแล้ว

ขอบคุณ


เที่ยงคืนไม่ใช่น. หรือน. ในทางเทคนิคแล้วไม่มีการประทับเวลาสำหรับเที่ยงคืน
hakre

16
@ ฮาเกรฉันไม่เห็นด้วยกับคุณ เที่ยงคืนคือเวลาและไม่ว่าจะประทับเวลาในรูปแบบใดก็ตามจะมีค่าสำหรับเที่ยงคืน
G-Nugget

1
ถ้า 00:00:00 พิจารณาวันนี้หรือพรุ่งนี้ เที่ยงคืนวันนี้อยู่ข้างหลังเราเกือบตลอดเวลาในทางเทคนิค คุณต้องการ 23:59:59 น. ของ "คืนนี้" หรือ 00:00:00 "เที่ยงคืนของวันนี้ซึ่งก็คือพรุ่งนี้" ไม่มากก็น้อย
wesside

5
เวลา 00:00:00 น. จะเป็นเวลาเที่ยงคืนของวันนี้เช่นเดียวกับเวลาที่จะถึง 00:00:00 ซึ่งเกิดขึ้นแล้ว โดยที่เวลา 23:59:59 น. จะเป็นคืนนี้ หากคุณพูดในแง่ของวันนี้ เที่ยงคืนคือน.
Nazca

4
00:00 น. เป็นเวลาเที่ยงคืนทุกวันเวลา 24:00 น. คือเที่ยงคืนของทุกวัน อย่างไรก็ตามเพื่อความเรียบง่ายนาฬิกาดิจิทัลส่วนใหญ่จะข้ามเวลา 24:00 น. - ประกาศว่าเที่ยงคืนเป็นวันเริ่มต้นของวันใหม่ คือวันที่ 8 กุมภาพันธ์ 24:00 น. และ 9 กุมภาพันธ์ 00:00 น. อยู่ในช่วงเวลาเดียวกัน
โยฮัน

คำตอบ:


240
$timestamp = strtotime('today midnight');

คุณอาจต้องการดูว่า PHP มีอะไรให้บ้าง: http://php.net/datetime


52
@ SamHuckaby: มันง่ายยิ่งกว่า$timestamp = strtotime('today');คือเที่ยงคืน แต่pssstข้างบนดูเท่กว่าเป็นคำตอบสำหรับคำถาม;)
hakre

ฉันต้องเริ่มตั้งแต่วันนี้ถึงเที่ยงคืนของวันนี้ ฉันจะหาจุดเริ่มต้นของวันนี้ได้อย่างไรฉันหมายถึง 00:00:00
Happy Coder

3
@AlwinAugustin: คุณควรพิจารณาที่จะใช้ถ้อยคำของคุณแตกต่างกัน เที่ยงคืนเป็นเทคนิคระหว่างสองวัน ดังนั้นจึงค่อนข้าง "ไม่มีวันนี้อีกต่อไป" นอกจากนี้: เที่ยงคืนของวันนี้ (ต่อคำจำกัดความ) คือ (ก่อนหน้า) การเริ่มต้นของวันนี้ คุณอาจหมายถึงเที่ยงคืนถัดไปหลังจากเที่ยงวันนี้
hakre

ใช่แล้วสิ่งที่ฉันต้องการคือ 00:00:00 ของวันนี้และ 23:59:59 น. ของวันนี้
Happy Coder

2
โปรดทราบว่านี่จะทำให้เวลาเที่ยงคืนของเขตเวลาเซิร์ฟเวอร์ PHP ของคุณไม่ใช่ UTC + 0 ! ที่จะได้รับ UTC + 0 strtotime('today+00:00')คุณสามารถใช้
แม่

74

ฉันคิดว่าคุณควรใช้วัตถุ PHP DateTime ใหม่เนื่องจากไม่มีปัญหาในการทำวันที่เกินข้อ จำกัด 32 บิตที่ strtotime () มี นี่คือตัวอย่างของวิธีที่คุณจะได้รับวันที่ของวันนี้ตอนเที่ยงคืน

$today = new DateTime();
$today->setTime(0,0);

หรือหากคุณใช้ PHP 5.4 ขึ้นไปคุณสามารถทำได้ด้วยวิธีนี้:

$today = (new DateTime())->setTime(0,0);

จากนั้นคุณสามารถใช้echo $today->format('Y-m-d');เพื่อรับรูปแบบที่คุณต้องการให้เอาต์พุตวัตถุของคุณเป็น

PHP DateTime Object


14
ฉันชอบใช้วัตถุ DateTime ใหม่ด้วย หากคุณรวมคำตอบนี้กับ @ hakr คุณจะได้รับ: new DateTime('today midnight')ซึ่งจะทำให้ความตั้งใจชัดเจนยิ่งขึ้น (แต่แน่นอนว่าเป็นเรื่องของรสนิยม)
Martijn

1
ฉันกำลังทำงาน ORM SQL และฉันต้องใช้วัตถุ DateTime เพื่อเปรียบเทียบ นี่คือสิ่งที่ฉันกำลังมองหา +1
NobleUplift

อาจเป็น$today = new DateTime('today')
ProgZi

นอกจากนี้ยังมีประโยชน์หากคุณใช้ Carbon ซึ่งสืบทอดมาจาก DateTime ดังนั้นคุณสามารถทำได้new Carbon('today midnight')จากนั้นคุณสามารถใช้คาร์บอนทั้งหมดเช่น->subDays(6). ดูcarbon.nesbot.com
Christopher K.

เกี่ยวกับข้อ จำกัด 32 บิต: PHP docu สำหรับสถานะ strtotime : "สำหรับ PHP เวอร์ชัน 64 บิตช่วงเวลาที่ถูกต้องของการประทับเวลาจะไม่มีที่สิ้นสุดอย่างมีประสิทธิภาพเนื่องจาก 64 บิตสามารถแทนได้ประมาณ 293 พันล้านปีในทิศทางใดทิศทางหนึ่ง" ดังนั้นจึงใช้กับ 32 บิต php เท่านั้น
Christopher K.


7

คุณกำลังต้องการคำนวณเวลาของเหตุการณ์ท้องฟ้าล่าสุดที่ดวงอาทิตย์ผ่านตรงใต้เท้าของคุณปรับให้เหมาะกับการจัดทำเครื่องหมายเวลาเที่ยงวันในท้องถิ่นและอาจปรับเปลี่ยนเพื่อให้ผู้คนมีเวลากลางวันเพียงพอหลังจากกลับบ้านจากที่ทำงานและสำหรับ การพิจารณาทางการเมืองอื่น ๆ

น่ากลัวใช่มั้ย? อันที่จริงปัญหานี้เป็นปัญหาทั่วไป แต่คำตอบที่สมบูรณ์ขึ้นอยู่กับตำแหน่ง:

$zone = new \DateTimeZone('America/New_York'); // Or your own definition of “here”
$todayStart = new \DateTime('today midnight', $zone);
$timestamp = $todayStart->getTimestamp();

คำจำกัดความที่เป็นไปได้ของ“ ที่นี่” แสดงอยู่ที่https://secure.php.net/manual/en/timezones.php


ชอบstrtotime('America/New_York today midnight');? - 3v4l.org/I85qD
hakre

5
$today_at_midnight = strtotime(date("Ymd"));

ควรให้สิ่งที่คุณต้องการ

คำอธิบาย

สิ่งที่ฉันทำคือใช้ฟังก์ชันวันที่ของ PHP เพื่อรับวันที่ของวันนี้โดยไม่ต้องอ้างอิงเวลาใด ๆ จากนั้นส่งต่อไปยังฟังก์ชัน 'string to time' ซึ่งจะแปลงวันที่และเวลาเป็นการประทับเวลายุค หากไม่ได้เวลาก็ถือว่าเป็นวินาทีแรกของวันนั้น

ข้อมูลอ้างอิง: ฟังก์ชันวันที่: http://php.net/manual/en/function.date.php

String To Time: http://us2.php.net/manual/en/function.strtotime.php


การประทับเวลา? นั่นเป็นเพียงวันที่
wesside

มีรูปแบบเฉพาะที่ OP ขอหรือไม่? ถ้าเป็นเช่นนั้นฉันยินดีที่จะแก้ไขโพสต์ของฉันให้กลับมาเป็นรูปแบบที่ต้องการ
SamHuckaby

มองข้ามไปโดยสิ้นเชิงstrtotime()จิตใจจดจ่ออยู่กับฟังก์ชันวันที่ ขอโทษ.
wesside

2

ในทางวัตถุเพิ่มเติม:

$today = new \DateTimeImmutable('today');

ตัวอย่าง:

 echo (new \DateTimeImmutable('today'))->format('Y-m-d H:i:s');
// will output: 2019-05-16 00:00:00

และ:

echo (new \DateTimeImmutable())->format('Y-m-d H:i:s');
echo (new \DateTimeImmutable('now'))->format('Y-m-d H:i:s');
// will output: 2019-05-16 14:00:35

1
$timestamp = strtotime('today midnight');

เหมือนกับ

$timestamp = strtotime('today');

และเซิร์ฟเวอร์ของคุณทำงานน้อยลงเล็กน้อย


0

$midnight = strtotime('midnight');เป็นที่ถูกต้อง
นอกจากนี้คุณยังสามารถลอง หรือstrtotime('12am') strtotime('[input any time you wish to here. e.g noon, 6pm, 3pm, 8pm, etc]')ฉันข้ามการเพิ่มวันนี้ก่อนเที่ยงคืนเพราะค่าเริ่มต้นคือวันนี้


0

หากคุณใช้ Carbon คุณสามารถทำสิ่งต่อไปนี้ได้ คุณสามารถจัดรูปแบบวันที่นี้เพื่อตั้งค่าExpireส่วนหัว HTTP

Carbon::parse('tomorrow midnight')->format(Carbon::RFC7231_FORMAT)

0

อัปเดตคำตอบในวันที่ 19 เมษายน 2020

เพียงแค่เราสามารถทำได้:

$today = date('Y-m-d 00:00:00');


-1

function getTodaysTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const startOfDay = currentTimeStamp - (currentTimeStamp % 86400);
  return { startOfDay, endOfDay: startOfDay + 86400 - 1 };
}

// starts from sunday
function getThisWeeksTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const currentDay = new Date(currentTimeStamp * 1000);
  const startOfWeek = currentTimeStamp - (currentDay.getDay() * 86400) - (currentTimeStamp % 86400);
  return { startOfWeek, endOfWeek: startOfWeek + 7 * 86400 - 1 };
}


function getThisMonthsTimeStamp() {
  const currentTimeStamp = Math.round(Date.now() / 1000);
  const currentDay = new Date(currentTimeStamp * 1000);
  const startOfMonth = currentTimeStamp - ((currentDay.getDate() - 1) * 86400) - (currentTimeStamp % 86400);
  const currentMonth = currentDay.getMonth() + 1;
  let daysInMonth = 0;
  if (currentMonth === 2) daysInMonth = 28;
  else if ([1, 3, 5, 7, 8, 10, 12].includes(currentMonth)) daysInMonth = 31;
  else daysInMonth = 30;
  return { startOfMonth, endOfMonth: startOfMonth + daysInMonth * 86400 - 1 };
}


console.log(getTodaysTimeStamp());
console.log(getThisWeeksTimeStamp());
console.log(getThisMonthsTimeStamp());


คำถามเกี่ยวข้องกับ PHP คำตอบนี้เขียนใน JavaScript
Electric Coffee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.