Làm cách nào để chuyển đổi ngày thành dấu thời gian trong PHP?


Câu trả lời:


612


Phương pháp này hoạt động trên cả Windows và Unix thời gian khu vực ý thức, mà có lẽ là những gì bạn muốn nếu bạn làm việc với ngày .

Nếu bạn không quan tâm đến múi giờ hoặc muốn sử dụng múi giờ mà máy chủ của bạn sử dụng:

$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 (Điều này sẽ khác nhau tùy theo múi giờ máy chủ của bạn ...)


Nếu bạn muốn chỉ định trong múi giờ nào, ở đây EST. (Giống như New York.)

$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


Hoặc nếu bạn muốn sử dụng UTC . (Giống như " 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


Bất kể, đó luôn là điểm khởi đầu tốt để nghiêm ngặt khi phân tích chuỗi thành dữ liệu có cấu trúc. Nó có thể lưu gỡ lỗi khó xử trong tương lai. Vì vậy, tôi khuyên bạn nên luôn luôn xác định định dạng ngày.


2
Thanh lịch. Tôi đã quên về điều đó!
Đến

53
Làm thế nào mà bạn chưa nhận được tín dụng cho câu trả lời này?!
Đánh dấu Tomlin

4
Một câu trả lời hoàn toàn hợp lệ, nhưng tôi ngạc nhiên rằng câu trả lời của Armin Ronacher không khớp với câu trả lời - sự mơ hồ là LUÔN LUÔN.
RonLugge

1
@Devner Vâng, có vẻ như, trên máy chủ của tôi, định dạng đó không được hỗ trợ. Có lẽ nó khác với bạn.
Lucas

1
Giải pháp này có thể dẫn đến một hành vi bất ngờ. Những người sử dụng PHP 5.3+ nên chấp nhận câu trả lời của Giáo sư Falken , trong đó một người có toàn quyền kiểm soát định dạng ngày.
Luca Fagioli

185

Ngoài ra còn có strptime () mong đợi chính xác một định dạng:

$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
nó phải được tm_mon thay vì tm_month và tm_mday thay vì tm_day
amarillion

68
Coi chừng, chức năng strptime không có sẵn trên Windows.
understack

12
Những người trên Windows và PHP 5.3.0+, hãy cân nhắc sử dụng date_parse_from_formatthay vì strptime.
Erwin Wessels

1
... bởi vì strptimekhông được triển khai trong các nền tảng Windows.
Randell

Vì đây là một câu trả lời được bình chọn cao, bạn sẽ xem xét chỉnh sửa nó thành một câu trả lời hoạt động trên PHP cho Windows cũng như unixen? Và IMHO lý tưởng nhất là đề cập đến múi giờ.
Hợp đồng của giáo sư Falken vi phạm

126

Với DateTimeAPI :

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

// or 

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

Tương tự với API thủ tục:

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

// or

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

Nếu cách trên không thành công vì bạn đang sử dụng định dạng không được hỗ trợ , bạn có thể sử dụng

$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');

Lưu ý rằng nếu bạn không đặt !, phần thời gian sẽ được đặt thành thời gian hiện tại, khác với bốn phần đầu sẽ sử dụng nửa đêm khi bạn bỏ qua thời gian.

Một cách khác là sử dụng IntlDateFormatterAPI:

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

Trừ khi bạn đang làm việc với các chuỗi ngày được bản địa hóa, sự lựa chọn dễ dàng hơn có thể là DateTime.


15
Tôi muốn giới thiệu điều này qua câu trả lời của tôi ngày hôm nay.
Đến

Arggg. ! Đừng quên ! dấu thời gian dựa trên ngày của tôi đã thay đổi trên mỗi lần làm mới và khiến tôi phát điên - vì DateTime đã hữu ích thêm thời gian hiện tại mà không cần hỏi hay được nói. Grrr.

Tôi muốn thêm rằng tôi khuyên bạn không nên phân tích cú pháp ngày mơ hồ và định dạng ngày phải được cung cấp rõ ràng khi phân tích chuỗi ngày.
Hợp đồng của giáo sư Falken vi phạm

114

Hãy cẩn thận với các chức năng như thế strtotime()cố gắng "đoán" ý của bạn (tất nhiên là không đoán được, các quy tắc ở đây ).

Quả thực 22-09-2008sẽ được phân tích thành ngày 22 tháng 9 năm 2008 , vì đó là điều hợp lý duy nhất.

Làm thế nào sẽ 08-09-2008được phân tích cú pháp? Có lẽ là ngày 09 tháng 8 năm 2008 .

Thế còn 2008-09-50? Một số phiên bản của PHP phân tích cú pháp này là ngày 20 tháng 10 năm 2008 .

Vì vậy, nếu bạn chắc chắn rằng đầu vào của bạn có DD-MM-YYYYđịnh dạng, tốt hơn là sử dụng giải pháp được cung cấp bởi @Armin Ronacher .


5
Quan tâm hợp lệ. Tôi đoán strtotime () dựa vào miền địa phương của bạn.
Đến

13
Lưu ý: trên hầu hết các quốc gia không nói tiếng Anh, định dạng là dd-mm-yyyykhông mm-dd-yyyy.
Camilo Martin

1
@CamiloMartin Hầu hết các quốc gia không nói tiếng Anh sử dụng định dạng đầu tiên bạn đã nêu nhưng DB thường lưu trữ ngày trong YYYY-mm-ddChuyển đổi chỉ xảy ra để hiển thị cho người dùng
Danny22

@DannyG chỉ nhìn vào các tài liệu và có vẻ như bạn đúng nếu DB có nghĩa là MySQL. Nhưng có vẻ thật nực cười khi làm điều này ...
Camilo Martin

57


Phương pháp này hoạt động trên cả Windows và Unix thời gian khu vực ý thức, mà có lẽ là những gì bạn muốn nếu bạn làm việc với ngày .

Nếu bạn không quan tâm đến múi giờ hoặc muốn sử dụng múi giờ mà máy chủ của bạn sử dụng:

$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 (Điều này sẽ khác nhau tùy theo múi giờ máy chủ của bạn ...)


Nếu bạn muốn chỉ định trong múi giờ nào, ở đây EST. (Giống như New York.)

$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


Hoặc nếu bạn muốn sử dụng UTC . (Giống như " 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


Bất kể, đó luôn là điểm khởi đầu tốt để nghiêm ngặt khi phân tích chuỗi thành dữ liệu có cấu trúc. Nó có thể lưu gỡ lỗi khó xử trong tương lai. Vì vậy, tôi khuyên bạn nên luôn luôn xác định định dạng ngày.


Này Falken, bạn được chào đón. Tuy nhiên, có lẽ tốt hơn là xác định rằng giải pháp này áp dụng cho PHP 5.3+
Luca Fagioli

43

Sử dụng mktime :

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

Đó là những gì tôi đã luôn luôn làm. Phát nổ nó trên - hoặc / hoặc. hoặc bất cứ điều gì nó được tách ra, sau đó mktime.
Bradshaw giàu

1
Có một lưu ý trong hướng dẫn sử dụng PHP cho tham số cuối cùng của hàm mktime: "Kể từ PHP 5.1.0, tham số này trở nên không dùng nữa. Do đó, nên sử dụng các tính năng xử lý múi giờ mới." Tôi vẫn chưa khám phá những tính năng mới mà họ nói về mặc dù họ chưa liên kết với nó!
Rất bất thường

Điều này tốt hơn nhiều so strtotime()với một số lý do strtotime()không hoạt động vào một số ngày nhất định và do đó rất không đáng tin cậy.
dspacejs

17

Sử dụng hàm strtotime () bạn có thể dễ dàng chuyển đổi ngày thành dấu thời gian

<?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);
?> 

Thông tin thêm: http://php.net/manual/en/feft.strtotime.php

Công cụ chuyển đổi trực tuyến: http://freeonlinetools24.com/


Đối với độc giả tương lai - strtotime () là một tai nạn và không nên sử dụng nó. Nó mơ hồ, bởi vì nó cố gắng đoán định dạng ngày. Ngay cả khi bạn sử dụng nó một cách chính xác, nó làm cho mã của bạn khó hiểu và lý do hơn và bạn có nguy cơ thay đổi được thực hiện cho cơ sở mã của mình, điều này sẽ gây ra lỗi, bởi vì bất kể bạn đưa gì cho strtotime (), nó sẽ tạo ra tốt nhất là đoán. Suy đoán đó có thể không chính xác, nhưng bạn sẽ không nhận được dấu hiệu nào cho thấy nó đoán sai. Đó là một khẩu súng ngắn. Sử dụng nó nếu bạn thích, nhưng người dùng mới làm quen có thể sử dụng một cảnh báo tôi nghĩ. Chú ý: súng ngắn phía trước
Hợp đồng của Giáo sư Falken vi phạm

12

Đây là một giải pháp rất đơn giản và hiệu quả bằng cách sử dụng splitvà các mtimechức năng:

$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);

Nó làm việc như một cơ duyên đối với tôi.


Lưu ý rằng split () hiện không được chấp nhận, nhưng nếu bạn đang sử dụng phiên bản php của ol, nó hoạt động rất tốt!
Hugo H

6

Vì chức năng strptime()này không hoạt động cho Windows và strtotime()có thể trả về kết quả không mong muốn, tôi khuyên bạn nên sử dụng 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
Lưu ý: với strtotime (): dấu phân cách là dấu gạch chéo (/), sau đó giả sử m / d / y của Mỹ; trong khi nếu dấu phân cách là dấu gạch ngang (-) hoặc dấu chấm (.), thì định dạng dmy châu Âu được giả sử. Vì vậy, tôi nghĩ không cần sử dụng strptime ()
secretlm

6

Nếu bạn muốn biết chắc chắn liệu một ngày có được phân tích thành thứ bạn mong đợi hay không, bạn có thể sử dụng 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

Rõ ràng trong trường hợp này, nhưng ví dụ 03-04-2008có thể là ngày 3 tháng 4 hoặc 4 tháng 3 tùy thuộc vào nơi bạn đến từ :)


1
DateTime::createFromFormat Trả về falselỗi , không null.
mở

5

Nếu bạn biết định dạng sử dụng strptimestrtotimeđoán định dạng, có thể không phải lúc nào cũng đúng. Vì strptimekhông được triển khai trong Windows nên có một chức năng tùy chỉnh

Hãy nhớ rằng giá trị trả về tm_yearlà từ năm 1900! và tm_monthlà 0-11

Thí dụ:

$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') ?>

Nếu bạn muốn, đặt nó trong dấu thời gian loại đầu vào MySQL . Ở trên hoạt động rất tốt (chỉ trong PHP 5 trở lên):

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

3

Đây là cách tôi làm:

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'];

Bằng cách này, bạn cho hàm biết định dạng ngày bạn đang sử dụng và thậm chí chỉ định múi giờ.


0

Hãy cẩn thận về thời gian / vùng nếu bạn đặt nó để lưu ngày trong cơ sở dữ liệu, vì tôi gặp vấn đề khi tôi so sánh ngày từ mysql đã chuyển đổi sang timestampsử dụngstrtotime . bạn phải sử dụng chính xác cùng thời gian / vùng trước khi chuyển đổi ngày thành dấu thời gian nếu không, strtotime () sẽ sử dụng múi giờ máy chủ mặc định.

Vui lòng xem ví dụ này: 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

Nếu bạn đang tìm cách chuyển đổi thời gian UTC ( 2016-02-14T12:24:48.321Z) thành dấu thời gian, thì đây là cách bạn thực hiện:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.