【问题标题】:Creating timestamp for 5/13/2014 @ 3pm为 5/13/2014 @ 3pm 创建时间戳
【发布时间】:2014-05-13 19:19:32
【问题描述】:

我有一个应用程序需要发送 UTC 时间戳才能正常工作。在我的应用程序中,用户可以拥有任意数量的时区。因此,如果他们选择下午 3 点并且他们的时区是 America/New_York,则与选择 America/Chicago 时的 3 点不同。

我需要想办法将日期更改为正确的 UTC 时间戳。我知道我可以使用 date_default_timezone_set("UTC")...但我认为不会正常工作。

我想我需要计算 UTC 和常规时区之间的差异,但我不确定。欢迎任何建议。

date_default_timezone_set("UTC");
echo strtotime('5/13/2014 3:00 PM');

1399993200

date_default_timezone_set("America/New_York");
echo strtotime('5/13/2014 3:00 PM');

1400007600

你可以看出这两个值是不同的。

编辑:这是我的代码的样子。它似乎无法正常工作,因为应用程序没有在正确的时间显示事件。

$previous_timezone = date_default_timezone_get();
date_default_timezone_set("UTC");
$aceroute_schedule = $this->sale_lib->get_send_to_aceroute_schedule();

if (($start_time = strtotime($aceroute_schedule['aceroute_schedule_date']. ' '.$aceroute_schedule['aceroute_schedule_time_start'])) !== FALSE)
{
    //Append 000 as as string for 32 bit systems
    $start_epoch = $start_time.'000';
    $end_epoch = strtotime('+ '.$aceroute_schedule['aceroute_duration'].' minutes', $start_time).'000';
}
else //Default to current time + 1 hour
{
        //Append 000 as as string for 32 bit systems
        $start_epoch = time().'000';
        $end_epoch = strtotime('+1 hour', time()).'000';
}

$event->start_epoch = $start_epoch;
$event->end_epoch = $end_epoch;

【问题讨论】:

  • 时间戳始终与时区无关——它们指的是某个时间点,而与当时您所在地区的挂钟时间无关。我不确定你的脑子里是否有条理的东西,也不太明白问题是什么。能不能表达的更清楚一点?

标签: php datetime


【解决方案1】:

更新:

这将在用户的 DateTimeZone ('America/New_York') 中创建一个 DateTime 对象。然后它将该对象的时区设置为 UTC。要获取时间戳(或日期的其他字符串表示形式),请使用 ::format()

# Create NY date
$NY = new DateTimeZone("America/New_York");
$NYdate = new DateTime('5/13/2014 3:00 PM', $NY);

# Set timezone to UTC
$UTC = new DateTimeZone("UTC");
$UTCdate = $NYdate->setTimezone($UTC);

# Get timestamp (PHP 5.2 compatible)
$timezone = $UTCdate->format('U');
var_dump($timezone); // a string containing UNIX timestamp

首先,我根据各自的 DateTimeZone 对象创建 2 个 DateTime 对象。然后我们可以使用 OOP ::diff() 来获取另一个包含有关时差信息的对象。或者我们可以使用简单的整数来表示与::getTimestamp 的秒数差异。

$date = '5/13/2014 3:00 PM';

# Create NY date
$NY = new DateTimeZone("America/New_York");
$NYdate = new DateTime($date, $NY);

# Create UTC date
$UTC = new DateTimeZone("UTC");
$UTCdate = new DateTime($date, $UTC);

# Find difference object
$diff = $NYdate->diff($UTCdate);
var_dump($diff); // a DateInterval object containing time difference info

# Find difference in seconds
$diff = $NYdate->getTimestamp() - $UTCdate->getTimestamp();
var_dump($diff); // an integer containing time difference in seconds

链接:

【讨论】:

  • 我需要支持 php 5.2 并且 getTimestamp 只有 5.3 或更新版本。你有什么想法吗?
  • $NYDate->format('U'); -- U 是 PHP 时间戳的日期格式。
  • 另外,我用我的代码更新了这个问题。我想你向我展示了如何获得差异,但我需要向应用程序发送 UTC 时间。
  • 我看到你的工作正常。我不明白为什么我的不起作用(在原始问题中)。是否因为我使用 UTC 开始日期,即使它不是 UTC 日期?是否将日期保存在当前时区,然后切换时区。
  • 是的,UNIX 时间戳是从 UNIX 纪元 (GMT) 算起的秒数。所以你只是得到了UTCAmerica/New_York 的通用时间。现在,您正在创建一个特定于America/New_York 的时间并将其转换为UTC。然后你可以用它做任何你想做的事情。我敢打赌,它可以按照您的想法完成,但我的示例更加结构化,OOP 有助于可视化正在发生的事情。
【解决方案2】:

http://www.php.net/manual/en/datetime.settimezone.php 中的示例

$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";

$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";

第一行创建一个DateTIme 对象,使用时区Pacific/Nauru

然后您可以使用setTimezone 更改时区,如第 4 行所示,输出将相应修改。

注意:默认时区(如果您未在第 1 行的第二个参数中指定)是您的 php.ini 文件中设置的一个,您可以使用 date_default_timezone_set("America/New_York") 修改(在运行时)

注意2:第1行的第一个参数,相当于strtotime函数的第一个参数。

注意3:format 方法采用与date (http://www.php.net/manual/en/function.date.php) 相同的格式参数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2017-09-28
    相关资源
    最近更新 更多