我想在PHP中以Paul Eggert格式(America/New_York
)给出一个时区的今天日期?
答案 0 :(得分:144)
其他答案设置系统中所有日期的时区。如果您想为用户支持多个时区,这并不总是有效。
以下是简短版本:
<?php
$date = new DateTime("now", new DateTimeZone('America/New_York') );
echo $date->format('Y-m-d H:i:s');
适用于PHP&gt; = 5.2.0
支持的时区列表:php.net/manual/en/timezones.php
以下是按用户设置显示现有时间和设置时区的版本
<?php
$usersTimezone = 'America/New_York';
$date = new DateTime( 'Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone) );
echo $date->format('Y-m-d H:i:s');
这是一个更详细的版本,可以更清楚地显示该过程
<?php
// Date for a specific date/time:
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT');
// Output date (as-is)
echo $date->format('l, F j Y g:i:s A');
// Output line break (for testing)
echo "\n<br />\n";
// Example user timezone (to show it can be used dynamically)
$usersTimezone = 'America/New_York';
// Convert timezone
$tz = new DateTimeZone($usersTimezone);
$date->setTimeZone($tz);
// Output date after
echo $date->format('l, F j Y g:i:s A');
我确定有很多其他库可用,但这些是我熟悉的。
当你在这里的时候,让我为你节省一些未来的头痛。假设您想从今天起计算1周,从今天起计算2周。您可以编写一些代码:
<?php
// Create a datetime (now, in this case 2017-Feb-11)
$today = new DateTime();
echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";
$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
echo "\n<br>";
输出:
2017-02-11
---
2017-03-04
2017-03-04
2017-03-04
嗯......那不是我们想要的。在PHP中修改传统的DateTime
对象不仅会返回更新的日期,还会修改原始对象。
这是DateTimeImmutable
的来源。
$today = new DateTimeImmutable();
echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";
$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));
echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
输出:
2017-02-11
---
2017-02-11
2017-02-18
2017-02-25
在第二个例子中,我们得到了我们预期的日期。通过使用DateTimeImmutable
代替DateTime
,我们可以防止意外的状态突变并防止潜在的错误。
答案 1 :(得分:52)
首先设置默认时区并获取日期,然后日期将在您指定的时区内:
<?php
date_default_timezone_set('America/New_York');
$date= date('m-d-Y') ;
?>
http://php.net/manual/en/function.date-default-timezone-set.php
答案 2 :(得分:4)
如果您可以访问PHP 5.3,intl extension非常适合这样做。
以下是手册中的一个示例:
$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/Los_Angeles',IntlDateFormatter::GREGORIAN );
$fmt->format(0); //0 for current time/date
在您的情况下,您可以这样做:
$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
'America/New_York');
$fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since epoch, UTC) or an array in the format output by localtime().
由于您可以设置America/New_York
等时区,这比使用GMT或UTC偏移要好得多,因为这也考虑了日光节约时间。
最后,因为intl扩展使用ICU数据,在创建自己的日期/时间格式时包含许多非常有用的功能。
答案 3 :(得分:4)
我创建了一些简单的函数,可用于将时间转换为任何时区:
function convertTimeToLocal($datetime,$timezone='Europe/Dublin') {
$given = new DateTime($datetime, new DateTimeZone("UTC"));
$given->setTimezone(new DateTimeZone($timezone));
$output = $given->format("Y-m-d"); //can change as per your requirement
return $output;
}
答案 4 :(得分:0)
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>