たとえばからタイムスタンプを取得するにはどうすればよい22-09-2008
ですか?
19 に答える
この方法は、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
$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
いずれにせよ、文字列を構造化データに解析するときは、常に厳密にすることから始めることをお勧めします。将来的に厄介なデバッグを省くことができます。したがって、常に日付形式を指定することをお勧めします。
厳密に 1 つの形式を期待する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);
DateTime
APIを使用:
$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');
を設定しない場合!
、時間部分は現在の時刻に設定されます。これは、時刻を省略したときに真夜中を使用する最初の4つとは異なります。
さらに別の方法は、IntlDateFormatter
APIを使用することです。
$formatter = new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'GMT',
IntlDateFormatter::GREGORIAN,
'dd-MM-yyyy'
);
echo $formatter->parse('22-09-2008');
ローカライズされた日付文字列を使用している場合を除いて、より簡単な選択はおそらくDateTimeです。
strtotime()
あなたが何を意味するのかを「推測」しようとするような関数に注意してください(もちろん、ルールはここにあります)。
確かに、それが唯一の合理的なものであるため、2008年9月22日22-09-2008
として解析されます。
どのよう08-09-2008
に解析されますか?おそらく2008年8月9日。
どう2008-09-50
ですか?PHPの一部のバージョンは、これを2008年10月20日として解析します。
したがって、入力がDD-MM-YYYY
フォーマットであることが確実な場合は、 @ArminRonacherが提供するソリューションを使用することをお勧めします。
mktime の使用:
list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
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);
それは私にとって魅力のように機能しました。
この関数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']);
日付が期待どおりに解析されるかどうかを確実に知りたい場合は、次を使用できます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
どこから来たかによって、4 月 3 日または 3 月 4 日になる可能性があります :)
形式を推測するstrptime
ため、形式の使用がわかっている場合は、常に正しいとは限りません。Windowsには実装されていないため、カスタム関数がありstrtotime
ますstrptime
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)
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>
<?php echo date('U') ?>
必要に応じて、MySQL入力タイプのタイムスタンプに入れます。上記は非常にうまく機能します(PHP 5以降でのみ):
<?php $timestamp_for_mysql = date('c') ?>
これが私がそれを行う方法です:
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'];
このようにして、使用している日付形式を関数に知らせ、タイムゾーンも指定します。
データベースに日付を保存するように設定する場合は、タイムゾーンに注意して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)
UTC 日時 ( ) をタイムスタンプに変換する場合は2016-02-14T12:24:48.321Z
、次のようにします。
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);