我需要一种简单的方法将日期时间戳转换为UTC(来自服务器所在的任何时区),而不使用任何库。
答案 0 :(得分:99)
使用strtotime从给定字符串生成时间戳(解释为本地时间)并使用gmdate将其作为格式化的UTC日期返回。
根据要求,这是一个简单的例子:
echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
答案 1 :(得分:55)
使用DateTime:
$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok
$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
答案 2 :(得分:27)
尝试getTimezone and setTimezone,请参阅示例
(但这确实使用了一个类)
更新:
没有任何课程,你可以尝试这样的事情:
$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");
注意:您可能还需要将时区设置回原来的
答案 3 :(得分:19)
这样做:
gmdate('Y-m-d H:i:s', $timestamp)
或只是
gmdate('Y-m-d H:i:s')
在UTC中获得“NOW”。
检查参考:
答案 4 :(得分:13)
如果您的日期格式为YYYY-MM-HH dd:mm:ss, 您可以通过在“datetime字符串”末尾添加UTC来实际欺骗php,并使用strtotime进行转换。
date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";
这将打印出来:
2009-01-01 13:00:00
2009-06-01 14:00:00
正如您所看到的那样,它也会解决夏令时问题。
解决它的一个奇怪的方法.... :)
答案 5 :(得分:5)
将本地时区字符串转换为UTC字符串 例如新西兰时区
public function delete($id)
{
$admin_name = $this->session->userdata('admin_name');
log_message('debug',"this record deleted by Admin = ".$admin_name );
$score = $this->score->delete_operation($id);
$error_data = array('error' => 'Error while deleting record');;
return json_encode(array("success" => true));
}
答案 6 :(得分:4)
我有时会使用这种方法:
// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");
// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));
工作所有 MOST 当时。
答案 7 :(得分:4)
由于strtotime需要特定的输入格式,因此可以使用DateTime::createFromFormat(需要php 5.3+ )
// set timezone to user timezone
date_default_timezone_set($str_user_timezone);
// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);
// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');
// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));
// return timezone to server default
date_default_timezone_set($str_server_timezone);
答案 8 :(得分:2)
如果您不介意使用PHP的DateTime类(自PHP 5.2.0开始提供),那么有几种情况可能适合您的情况:
如果您有一个$givenDt
DateTime对象要转换为UTC,那么它将把它转换为UTC:
$givenDt->setTimezone(new DateTimeZone('UTC'));
如果以后需要原始的$givenDt
,则可能要在转换克隆的对象之前克隆给定的DateTime对象:
$utcDt = clone $givenDt;
$utcDt->setTimezone(new DateTimeZone('UTC'));
如果只有日期时间字符串,例如$givenStr = '2018-12-17 10:47:12'
,然后您首先创建一个日期时间对象,然后对其进行转换。请注意,这假设$givenStr
在PHP的配置时区中。
$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
如果给定的datetime字符串所在的时区与PHP配置中的时区不同,则通过提供正确的时区来创建datetime对象(请参见list of timezones PHP supports)。在此示例中,我们假设阿姆斯特丹为当地时区:
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
$givenDt->setTimezone(new DateTimeZone('UTC'));
答案 9 :(得分:1)
http://php.net/manual/en/function.strtotime.php或者如果您不需要使用字符串而不是时间组件,那么http://us.php.net/manual/en/function.mktime.php
答案 10 :(得分:1)
使用PHP 5或更高版本,您可以使用 datetime :: format 功能(参见文档http://us.php.net/manual/en/datetime.format.php)
echo strftime( '%e %B %Y' ,
date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U')
); // 4 May 2012
答案 11 :(得分:1)
请按照以下步骤操作,以获取用户本地系统中设置的任何时区的 UTC时间(对于网络应用程序,将不同的时区保存到UTC,这是必需的):>
JavaScript(客户端): Php(服务器端):
var dateVar = new Date();
var offset = dateVar.getTimezoneOffset();
//getTimezoneOffset - returns the timezone difference between UTC and Local Time
document.cookie = "offset="+offset;
public function convert_utc_time($date)
{
$time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:'';
if($time_difference != ''){
$time = strtotime($date);
$time = $time + ($time_difference*60); //minutes * 60 seconds
$date = date("Y-m-d H:i:s", $time);
} //on failure of js, default timezone is set as UTC below
return $date;
}
..
..
//in my function
$timezone = 'UTC';
$date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s')
echo strtotime($date. ' '. $timezone)
答案 12 :(得分:0)
尝试
回音日期('F d Y',strtotime('2010-01-19 00:00:00'));
将输出:
2010年1月19日
您应该更改格式时间以查看其他输出
答案 13 :(得分:0)
通用规范化功能,用于格式化从任何时区到其他时区的任何时间戳。
对于存储关系数据库中不同时区的用户的datetimestamp非常有用。对于数据库比较,将时间戳存储为UTC并与gmdate('Y-m-d H:i:s')
/**
* Convert Datetime from any given olsonzone to other.
* @return datetime in user specified format
*/
function datetimeconv($datetime, $from, $to)
{
try {
if ($from['localeFormat'] != 'Y-m-d H:i:s') {
$datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
}
$datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
$datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
return $datetime->format($to['localeFormat']);
} catch (\Exception $e) {
return null;
}
}
<强> 用法:的强>
$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta']; $to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC']; datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
答案 14 :(得分:0)
作为对Phill Pafford's answer的改进(我不理解他的'Y-d-mTG:我:sz&#39;他建议恢复时区)。 所以我建议这个(我通过改变普通/文本中的HMTL格式来复杂化):
<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");
// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";
// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";
// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n";
?>
答案 15 :(得分:0)
或者你可以试试这个:
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
这将输出:
2017-10-25 17:13:20亚洲/新加坡
如果您只想显示一个只读日期,可以在文本输入框的value属性中使用它。
删除&#39; e&#39;如果您不想展示您所在的地区/国家。