获取当前日期,给定 PHP 中的时区?图书馆奖励课程:不可变日期对象

2022-08-30 07:59:49

我想在PHP中以Paul Eggert格式()获得给定时区的今天日期?America/New_York


答案 1

其他答案为系统中的所有日期设置时区。如果您想为用户支持多个时区,这并不总是奏效。

以下是简短版本:

<?php
$date = new DateTime("now", new DateTimeZone('America/New_York') );
echo $date->format('Y-m-d H:i:s');

适用于 PHP >= 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');

图书馆

  • Carbon — 一个非常流行的日期库。
  • Chronos — Carbon的直接替代品,专注于不变性。请参阅下文,了解为什么这很重要。
  • jenssegers/date — Carbon 的扩展,增加了多语言支持。

我相信还有其他一些可用的库,但这些是我熟悉的一些。


奖励课程:不可变日期对象

当你在这里时,让我为你省去一些未来的头痛。假设您想从今天开始计算 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 

在第二个示例中,我们返回预期的日期。通过使用 代替 ,我们可以防止意外的状态突变并防止潜在的错误。DateTimeImmutableDateTime


答案 2

首先设置默认时区并获取日期,然后,日期将位于您指定的时区中:

<?php 
 date_default_timezone_set('America/New_York');
 $date= date('m-d-Y') ;
 ?>

http://php.net/manual/en/function.date-default-timezone-set.php


推荐