Làm thế nào để tôi có được dấu thời gian từ ví dụ 22-09-2008
?
Làm thế nào để tôi có được dấu thời gian từ ví dụ 22-09-2008
?
Câu trả lời:
Phương pháp này hoạt động trên cả Windows và Unix và là 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.
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);
date_parse_from_format
thay vì strptime
.
strptime
không được triển khai trong các nền tảng Windows.
Với DateTime
API :
$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 IntlDateFormatter
API:
$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.
!
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.
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-2008
sẽ đượ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 .
dd-mm-yyyy
không mm-dd-yyyy
.
YYYY-mm-dd
Chuyển đổi chỉ xảy ra để hiển thị cho người dùng
Phương pháp này hoạt động trên cả Windows và Unix và là 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.
Sử dụng mktime :
list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
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.
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/
Đây là một giải pháp rất đơn giản và hiệu quả bằng cách sử dụng split
và các mtime
chứ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.
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']);
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-2008
có 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ừ :)
Nếu bạn biết định dạng sử dụng strptime
vì strtotime
đoán định dạng, có thể không phải lúc nào cũng đúng. Vì strptime
khô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_year
là từ năm 1900! và tm_month
là 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)
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>
$time = '22-09-2008';
echo strtotime($time);
Sử dụng chức năng PHP strtotime()
echo strtotime('2019/06/06');
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
Đâ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ờ.
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 timestamp
sử 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)
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);