วิธีการแปลงวันที่เพื่อประทับเวลาใน PHP?


คำตอบ:


612


วิธีการนี้จะทำงานบนทั้ง Windows และ Unix และเป็นโซนเวลาตระหนักถึงซึ่งอาจเป็นสิ่งที่คุณต้องการหากคุณทำงานกับวันที่

หากคุณไม่สนใจเขตเวลาหรือต้องการใช้เขตเวลาที่เซิร์ฟเวอร์ของคุณใช้:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (สิ่งนี้จะแตกต่างกันไปขึ้นอยู่กับเขตเวลาของเซิร์ฟเวอร์ของคุณ ... )


หากคุณต้องการระบุเขตเวลาที่นี่ EST (เหมือนกับนิวยอร์ก)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


หรือถ้าคุณต้องการที่จะใช้เวลา UTC (เหมือนกับ " GMT ")

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


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


2
สง่า ฉันลืมไปแล้ว!
จนถึง

53
ทำไมคุณถึงยังไม่ได้เครดิตสำหรับคำตอบนี้?!
Mark Tomlin

4
คำตอบที่ถูกต้องสมบูรณ์ แต่ฉันแปลกใจที่คำตอบของ Armin Ronacher ไม่ได้จับคู่ใน upvotes - ความกำกวมนั้นแย่เสมอ
RonLugge

1
@Devner ดูเหมือนว่าเซิร์ฟเวอร์ของฉันไม่รองรับรูปแบบดังกล่าว อาจจะแตกต่างกับคุณ
ลูคัส

1
วิธีนี้สามารถนำไปสู่พฤติกรรมที่ไม่คาดคิด ผู้ที่ใช้ PHP 5.3+ ควรใช้คำตอบของ Prof. Falkenซึ่งมีการควบคุมรูปแบบวันที่อย่างสมบูรณ์
Luca Fagioli

185

นอกจากนี้ยังมีstrptime ()ซึ่งคาดว่าหนึ่งรูปแบบ:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900);

4
ควรเป็น tm_mon แทนที่จะเป็น tm_month และ tm_mday แทนที่จะเป็น tm_day
2552

68
ระวังฟังก์ชั่น strptime ไม่สามารถใช้ได้บน Windows
understack

12
ผู้ที่อยู่ใน Windows และ PHP 5.3.0+ พิจารณาใช้แทนdate_parse_from_format strptime
เออร์วินเวสเซล

1
... เพราะstrptimeไม่ได้ติดตั้งในแพลตฟอร์ม Windows
Randell

เนื่องจากนี่เป็นคำตอบที่ได้รับการโหวตอย่างสูงคุณจะลองแก้ไขเป็นคำตอบที่ใช้งานได้กับ PHP สำหรับ Windows และ Unixen หรือไม่ และ IMHO ในอุดมคติควรกล่าวถึงเขตเวลา
ศ. Falken ผิดสัญญา

126

ด้วยDateTimeAPI :

$dateTime = new DateTime('2008-09-22'); 
echo $dateTime->format('U'); 

// or 

$date = new DateTime('2008-09-22');
echo $date->getTimestamp();

เช่นเดียวกับ API ขั้นตอน:

$date = date_create('2008-09-22');
echo date_format($date, 'U');

// or

$date = date_create('2008-09-22');
echo date_timestamp_get($date);

หากข้างต้นล้มเหลวเนื่องจากคุณใช้รูปแบบที่ไม่รองรับคุณสามารถใช้

$date = DateTime::createFromFormat('!d-m-Y', '22-09-2008');
echo $dateTime->format('U'); 

// or

$date = date_parse_from_format('!d-m-Y', '22-09-2008');
echo date_format($date, 'U');

โปรดทราบว่าหากคุณไม่ได้ตั้งค่า!ส่วนเวลาจะถูกตั้งค่าเป็นเวลาปัจจุบันซึ่งแตกต่างจากสี่ช่วงแรกซึ่งจะใช้เวลาเที่ยงคืนเมื่อคุณข้ามเวลา

อีกทางเลือกหนึ่งคือการใช้IntlDateFormatterAPI:

$formatter = new IntlDateFormatter(
    'en_US',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'GMT',
    IntlDateFormatter::GREGORIAN,
    'dd-MM-yyyy'
);
echo $formatter->parse('22-09-2008');

ถ้าคุณไม่ทำงานกับสตริงวันที่ที่แปลแล้วตัวเลือกที่ง่ายกว่าก็คือ DateTime


15
ฉันจะแนะนำสิ่งนี้มากกว่าคำตอบของฉันในปัจจุบัน
จนถึง

Arggg ! อย่าลืมการ! ประทับเวลาตามวันที่ของฉันเปลี่ยนแปลงในการรีเฟรชแต่ละครั้งและทำให้ฉันโมโห - เพราะ DateTime ช่วยเพิ่มเวลาปัจจุบันโดยไม่ต้องถามหรือบอก ฮึ่ม

ฉันต้องการเพิ่มที่ฉันแนะนำกับการแยกวิเคราะห์วันที่คลุมเครือและรูปแบบวันที่ควรได้รับอย่างชัดเจนเมื่อแยกสตริงวันที่
ศ. Falken ผิดสัญญา

114

ระวังฟังก์ชั่นเช่นstrtotime()นั้นลอง "เดา" สิ่งที่คุณหมายถึง (ไม่ต้องเดาแน่นอนกฎอยู่ที่นี่ )

22-09-2008จะมีการแยกวิเคราะห์จริงในวันที่ 22 กันยายน 2551เนื่องจากเป็นสิ่งที่สมเหตุสมผลเท่านั้น

จะ08-09-2008แยกวิเคราะห์ได้อย่างไร อาจ9 สิงหาคม 2008

เกี่ยวกับ2008-09-50อะไร บางรุ่นของ PHP แยกนี้เป็น20 ตุลาคม 2008

ดังนั้นถ้าคุณแน่ใจว่าใส่ของคุณอยู่ในDD-MM-YYYYรูปแบบมันจะดีกว่าที่จะใช้วิธีการแก้ปัญหาที่นำเสนอโดย@Armin Ronacher


5
ความกังวลที่ถูกต้อง ฉันเดา strtotime () อาศัยอยู่ในสถานที่ของคุณ
จนถึง

13
หมายเหตุ: ในประเทศที่พูดภาษาที่ไม่ใช่ภาษาอังกฤษมากที่สุดรูปแบบคือไม่dd-mm-yyyy mm-dd-yyyy
Camilo Martin

1
@CamiloMartin ประเทศที่ไม่พูดภาษาอังกฤษส่วนใหญ่ใช้รูปแบบแรกที่คุณระบุ แต่ DB มักจะเก็บวันที่ไว้ในYYYY-mm-ddการแปลงเกิดขึ้นเฉพาะกับผู้ใช้ที่แสดง
Danny22

@DannyG เพียงแค่ดูเอกสารและดูเหมือนว่าคุณถูกถ้า DB คุณหมายถึง MySQL แต่มันจะดูเหมือนไร้สาระที่จะทำเช่นนี้ ...
Camilo มาร์ติน

57


วิธีการนี้จะทำงานบนทั้ง Windows และ Unix และเป็นโซนเวลาตระหนักถึงซึ่งอาจเป็นสิ่งที่คุณต้องการหากคุณทำงานกับวันที่

หากคุณไม่สนใจเขตเวลาหรือต้องการใช้เขตเวลาที่เซิร์ฟเวอร์ของคุณใช้:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (สิ่งนี้จะแตกต่างกันไปขึ้นอยู่กับเขตเวลาของเซิร์ฟเวอร์ของคุณ ... )


หากคุณต้องการระบุเขตเวลาที่นี่ EST (เหมือนกับนิวยอร์ก)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


หรือถ้าคุณต้องการที่จะใช้เวลา UTC (เหมือนกับ " GMT ")

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


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


เฮ้ฟัลเคนยินดีต้อนรับ อย่างไรก็ตามอาจเป็นการดีกว่าที่จะระบุว่าวิธีนี้ใช้ได้กับ PHP 5.3+
Luca Fagioli

43

ใช้mktime :

list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);

นั่นคือสิ่งที่ฉันทำมาตลอด ระเบิดมันบน - หรือ / หรือ หรืออะไรก็ตามที่มันแยกจากกันแล้ว mktime
Rich Bradshaw

1
มีหมายเหตุในคู่มือ PHP สำหรับพารามิเตอร์สุดท้ายของฟังก์ชั่น mktime: "ตั้งแต่ PHP 5.1.0 พารามิเตอร์นี้เลิกใช้แล้วดังนั้นจึงควรใช้คุณลักษณะการจัดการเขตเวลาใหม่แทน" ฉันยังไม่ได้ค้นพบคุณสมบัติใหม่ที่พวกเขาพูดถึงเพราะพวกเขาไม่ได้เชื่อมโยงกับมัน!
ผิดปกติมาก

นี่ดีกว่าstrtotime()ด้วยเหตุผลบางอย่างstrtotime()ไม่ทำงานในบางวันและดังนั้นจึงไม่น่าเชื่อถือมาก
dspacejs

17

ใช้ strtotime () ฟังก์ชั่นคุณสามารถแปลงวันที่เพื่อประทับเวลา

<?php
// set default timezone
date_default_timezone_set('America/Los_Angeles');

//define date and time
$date = date("d M Y H:i:s");

// output
echo strtotime($date);
?> 

ข้อมูลเพิ่มเติม: http://php.net/manual/en/function.strtotime.php

เครื่องมือแปลงออนไลน์: http://freeonlinetools24.com/


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

12

นี่เป็นวิธีที่ง่ายและมีประสิทธิภาพในการใช้splitและmtimeฟังก์ชั่น:

$date="30/07/2010 13:24"; //Date example
list($day, $month, $year, $hour, $minute) = split('[/ :]', $date); 

//The variables should be arranged according to your date format and so the separators
$timestamp = mktime($hour, $minute, 0, $month, $day, $year);
echo date("r", $timestamp);

มันได้ผลเหมือนมนต์เสน่ห์สำหรับฉัน


โปรดทราบว่าตอนนี้ split () ไม่ได้รับการสนับสนุน แต่หากคุณใช้เวอร์ชัน olp php มันทำงานได้ดีมาก!
Hugo H

6

เนื่องจากฟังก์ชั่นstrptime()นี้ใช้ไม่ได้กับ Windows และstrtotime()สามารถให้ผลลัพธ์ที่ไม่คาดคิดได้ฉันขอแนะนำให้ใช้date_parse_from_format():

$date = date_parse_from_format('d-m-Y', '22-09-2008');
$timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);

2
หมายเหตุ: ด้วย strtotime (): ตัวคั่นเป็นเครื่องหมายทับ (/) จากนั้นจะถือว่าอเมริกัน m / d / y ในขณะที่ถ้าตัวคั่นเป็นเส้นประ (-) หรือจุด (.) ดังนั้นรูปแบบ dmy ของยุโรปจะถือว่า ดังนั้นฉันคิดว่าไม่จำเป็นต้องใช้ strptime ()
secretlm

6

หากคุณต้องการทราบว่าวันที่ได้รับการแยกวิเคราะห์เป็นสิ่งที่คุณคาดหวังหรือไม่คุณสามารถใช้DateTime::createFromFormat():

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008');
if ($d === false) {
    die("Woah, that date doesn't look right!");
}
echo $d->format('Y-m-d'), PHP_EOL;
// prints 2008-09-22

เห็นได้ชัดในกรณีนี้ แต่เช่น03-04-2008อาจเป็นวันที่ 3 เมษายนหรือ 4 มีนาคมขึ้นอยู่กับว่าคุณมาจากไหน :)


1
DateTime::createFromFormat ผลตอบแทนfalseในข้อผิดพลาดnullไม่ได้
mpen

5

หากคุณรู้ว่ารูปแบบการใช้งานstrptimeเพราะstrtotimeเดารูปแบบซึ่งอาจไม่ถูกต้องเสมอไป เนื่องจากstrptimeไม่ได้ใช้งานใน Windows จึงมีฟังก์ชั่นที่กำหนดเอง

โปรดจำไว้ว่าผลตอบแทนที่tm_yearได้จาก 1900! และtm_monthเป็น 0-11

ตัวอย่าง:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900)




3
function date_to_stamp( $date, $slash_time = true, $timezone = 'Europe/London', $expression = "#^\d{2}([^\d]*)\d{2}([^\d]*)\d{4}$#is" ) {
    $return = false;
    $_timezone = date_default_timezone_get();
    date_default_timezone_set( $timezone );
    if( preg_match( $expression, $date, $matches ) )
        $return = date( "Y-m-d " . ( $slash_time ? '00:00:00' : "h:i:s" ), strtotime( str_replace( array($matches[1], $matches[2]), '-', $date ) . ' ' . date("h:i:s") ) );
    date_default_timezone_set( $_timezone );
    return $return;
}

// expression may need changing in relation to timezone
echo date_to_stamp('19/03/1986', false) . '<br />';
echo date_to_stamp('19**03**1986', false) . '<br />';
echo date_to_stamp('19.03.1986') . '<br />';
echo date_to_stamp('19.03.1986', false, 'Asia/Aden') . '<br />';
echo date('Y-m-d h:i:s') . '<br />';

//1986-03-19 02:37:30
//1986-03-19 02:37:30
//1986-03-19 00:00:00
//1986-03-19 05:37:30
//2012-02-12 02:37:30

3
<?php echo date('U') ?>

หากคุณต้องการให้ใส่ไว้ในการประทับเวลาชนิดอินพุตMySQL ข้างต้นใช้งานได้ดีมาก (เฉพาะใน PHP 5 หรือใหม่กว่า):

<?php $timestamp_for_mysql = date('c') ?>

3

นี่คือวิธีที่ฉันจะทำ:

function dateToTimestamp($date, $format, $timezone='Europe/Belgrade')
{
    //returns an array containing day start and day end timestamps
    $old_timezone=date_timezone_get();
    date_default_timezone_set($timezone);
    $date=strptime($date,$format);
    $day_start=mktime(0,0,0,++$date['tm_mon'],++$date['tm_mday'],($date['tm_year']+1900));
    $day_end=$day_start+(60*60*24);
    date_default_timezone_set($old_timezone);
    return array('day_start'=>$day_start, 'day_end'=>$day_end);
}

$timestamps=dateToTimestamp('15.02.1991.', '%d.%m.%Y.', 'Europe/London');
$day_start=$timestamps['day_start'];

ด้วยวิธีนี้คุณจะให้ฟังก์ชั่นทราบว่าคุณใช้รูปแบบวันที่ใดและระบุเขตเวลา


0

โปรดระวังเกี่ยวกับเวลา / โซนหากคุณตั้งให้บันทึกวันที่ในฐานข้อมูลเนื่องจากฉันมีปัญหาเมื่อฉันเปรียบเทียบวันที่จาก mysql ที่แปลงเป็นการtimestampใช้strtotimeใช้คุณต้องใช้เวลา / โซนเดียวกันก่อนที่จะแปลงวันที่เป็นเวลามิฉะนั้น strtotime () จะใช้เขตเวลาเซิร์ฟเวอร์เริ่มต้น

โปรดดูตัวอย่างนี้: https://3v4l.org/BRlmV

function getthistime($type, $modify = null) {
    $now = new DateTime(null, new DateTimeZone('Asia/Baghdad'));
    if($modify) {
        $now->modify($modify);
    }
    if(!isset($type) || $type == 'datetime') {
        return $now->format('Y-m-d H:i:s');
    }
    if($type == 'time') {
        return $now->format('H:i:s');
    }
    if($type == 'timestamp') {
        return $now->getTimestamp();
    }
}
function timestampfromdate($date) {
    return DateTime::createFromFormat('Y-m-d H:i:s', $date, new DateTimeZone('Asia/Baghdad'))->getTimestamp();
}

echo getthistime('timestamp')."--".
    timestampfromdate(getthistime('datetime'))."--".
    strtotime(getthistime('datetime'));

//getthistime('timestamp') == timestampfromdate(getthistime('datetime')) (true)
//getthistime('timestamp') == strtotime(getthistime('datetime')) (false)

-4

หากคุณต้องการแปลง UTC วันที่และเวลา ( 2016-02-14T12:24:48.321Z) เป็น timestamp นี่คือวิธีที่คุณทำ:

function UTCToTimestamp($utc_datetime_str)
{
    preg_match_all('/(.+?)T(.+?)\.(.*?)Z/i', $utc_datetime_str, $matches_arr);
    $datetime_str = $matches_arr[1][0]." ".$matches_arr[2][0];

    return strtotime($datetime_str);
}

$my_utc_datetime_str = '2016-02-14T12:24:48.321Z';
$my_timestamp_str = UTCToTimestamp($my_utc_datetime_str);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.