strtotime ส่งคืนปีปัจจุบันเมื่ออินพุตอยู่ในรูปแบบ YYYY และค่ามากกว่า 1999

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

ในขณะที่อยู่ท่ามกลางสคริปต์ (ค่อนข้างเจ็บปวด) ที่มีจุดประสงค์เพื่อใช้บันทึกข้อความอิสระจำนวนมากและแปลงเป็นบันทึกวันที่ที่มีประโยชน์ strtotime() เพื่อนที่ไว้ใจได้ของฉันดูเหมือนจะทำให้ฉันผิดหวัง

เพื่อวัตถุประสงค์ในการทดสอบ ฉันต้มโค้ดลงไปดังนี้:

<?=date('Y', strtotime("1999"));?>

เอาท์พุทแสดง: 1999

<?=date('Y', strtotime("1981"));?>

ผลลัพธ์แสดง: 1981

<?=date('Y', strtotime("2001"));?>

เอาท์พุทแสดง: 2012

<?=date('Y', strtotime("2021"));?>

เอาท์พุทแสดง: 2012

ทุกอย่างดูดีจนกระทั่งอินพุตเกิน "1999"- จากจุดนั้นทุกปีก่อนและหลังปีปัจจุบันจะส่งกลับปีปัจจุบัน (2012)

ข้อมูลใด ๆ ที่ชื่นชมมาก


person cailen    schedule 23.02.2012    source แหล่งที่มา
comment
strtotime ไม่เคยเชื่อถือได้ และแน่นอนว่าไม่ใช่เพื่อนของคุณ มันเป็นเพียงการชะล้าง การแขวนคอเพื่อชีวิตที่รัก ขยะที่พูดถึงทางเลือกที่ดีกว่าเช่น DateTime   -  person Marc B    schedule 24.02.2012


คำตอบ (4)


ตามเอกสารรูปแบบวันที่/เวลาของ PHP:

รูปแบบ "ปี (และเฉพาะปี)" ใช้งานได้เฉพาะเมื่อพบสตริงเวลาแล้วเท่านั้น ไม่เช่นนั้นรูปแบบนี้จะถือเป็น HH MM

(หมายเหตุสุดท้ายที่ 2 ของหน้า)

person Marc B    schedule 23.02.2012
comment
ต้องไปกับคำตอบที่เรียกฉันว่า RTFM ไม่รอบคอบเพียงพอ ขอบคุณทุกท่านครับ มีประโยชน์มาก - person cailen; 24.02.2012
comment
ขอโทษด้วย การค้นหาสตริงเวลาแล้วเมื่อผ่านปีที่ strtotime หมายความว่าอย่างไร - person Euri Pinhollow; 13.11.2017

ลองนำหน้าปีด้วย Jan 1,

ตัวอย่างเช่น:

<?=date('Y', strtotime("Jan 1, 2021"));?> เอาต์พุต 2021 ตามที่คาดไว้

ฉันคิดว่าเป็นเพราะบางปีสามารถแยกวิเคราะห์เป็นคู่เดือน/วันอย่างไม่ถูกต้อง เช่น "2012" ถูกตีความว่าเป็น "20 ธันวาคมของปีปัจจุบัน"

หากคุณต้องการพิสูจน์ตัวเอง ลองเปลี่ยนรูปแบบวันที่เป็น r:
<?=date('r', strtotime('2001'));?> ให้ Thu, 23 Feb 2012 20:01:00

person Mr. Llama    schedule 23.02.2012

ปัญหาคือว่าแยกวิเคราะห์เป็นเวลา สิ่งที่คุณจะเห็นได้หากคุณใช้ date('c') แทน date('Y');

php > var_dump(date('c', strtotime("2001")));
string(25) "2012-02-23T20:01:00+01:00"

คุณควรส่งค่าที่ไม่คลุมเครือ เช่น 2012-01-01

วิธีแก้ไขอีกอย่างหนึ่งคือการใช้ฟังก์ชันที่อนุญาตให้ระบุรูปแบบของอินพุตที่กำหนด เช่น strptime() หรือ DateTime::createFromFormat()

php > echo DateTime::createFromFormat('Y', '2001')->format('c');
2001-02-23T22:29:56+01:00
person KingCrunch    schedule 23.02.2012

ใช้สิ่งนี้:

echo date('Y', strtotime("1/1/2001"));
echo date('Y', strtotime("1/1/2021"));

การใช้ตัวเลข 4 หลักเป็นวันที่สามารถตีความเป็นเวลาได้ คุณควรใช้รูปแบบที่เฉพาะเจาะจงมากขึ้นเพื่อให้แน่ใจว่าฟังก์ชันทำงานตามที่คุณคาดหวัง ดังนั้น ปี 2021 คือ 20:21 (รูปแบบ 24 ชม.) ของปี 2012

person John    schedule 23.02.2012