我在几分钟内存储了UTC的偏移量:例如-240
我试图找到当前日期午夜对应的特定偏移量的UNIX时间戳。
我在类似这样的问题中找到了类似的信息:How do I get the UTC time of "midnight" for a given timezone?
但是,我没有城市名称/时区管辖权,只有一分钟的抵消。我认为这应该没问题,因为出于我的目的,我不需要考虑夏令时,它可能会在一小时后关闭,但仍然没问题。
实施例
抵消:-420
2014年12月7日午夜:1405148400(unix TS)
使用UTC,我必须首先判断它是否是TZ的第二天或同一天,因为它可能有一个不同的"最后一个午夜"。
答案 0 :(得分:1)
虽然这个解决方案看起来有点难看但它确实做了我认为你要求的!此示例使用-180分钟作为偏移量。
date_default_timezone_set('UTC');
// Work out which day the time zone is in
$day = strtotime('-180 minutes');
// Strip of the time part of the day, to give UTC midnight on the correct day
$utcMidnight = strtotime('midnight', $day);
// Now apply the offset in reverse to give the zone's midnight
$zoneMidnight = strtotime('+180 minutes', $utcMidnight);
答案 1 :(得分:0)
您可以使用date_default_timezone_set
使所有与时间相关的功能确认转变。首先要做的是将这些分钟转换为小时,因为n和n + 1之间的UTC差距为1小时。
$hours = $minutes / 60;
我还建议您先检查分钟值:
if($minutes % 60 == 0) // We're good.
现在,如果要将UTC偏移转换为时区,可以创建函数:
<?php
function offsetToTimezone($offset){
$timezones = array(
"-12" => "Pacific/Kwajalein",
"-11" => "Pacific/Samoa",
"-10" => "Pacific/Honolulu",
"-9" => "America/Juneau",
"-8" => "America/Los_Angeles",
"-7" => "America/Denver",
"-6" => "America/Mexico_City",
"-5" => "America/New_York",
"-4" => "America/Caracas",
"-3.5" => "America/St_Johns",
"-3" => "America/Argentina/Buenos_Aires",
"-2" => "Atlantic/Azores",
"-1" => "Atlantic/Azores",
"0" => "Europe/London",
"1" => "Europe/Paris",
"2" => "Europe/Helsinki",
"3" => "Europe/Moscow",
"3.5" => "Asia/Tehran",
"4" => "Asia/Baku",
"4.5" => "Asia/Kabul",
"5" => "Asia/Karachi",
"5.5" => "Asia/Calcutta",
"6" => "Asia/Colombo",
"7" => "Asia/Bangkok",
"8" => "Asia/Singapore",
"9" => "Asia/Tokyo",
"9.5" => "Australia/Darwin",
"10" => "Pacific/Guam",
"11" => "Asia/Magadan",
"12" => "Asia/Kamchatka"
);
return $timezones[$offset];
}
?>
...并使用if进行转换:
date_default_timezone_set(offsetToTimezone($hours));
顺便说一下,我建议您查看this answer,它为您提供了一种更优雅的方式来实现offsetToTimezone
的工作。
现在你的脚本如果在正确的时区配置,只需要一个时间戳:
$timestamp = mktime(0, 0, 0);
如果在某个时候,您需要将时区重置为默认值,则可能需要date_default_timezone_get
来保存它:
$timezone = date_default_timezone_get();
// Change to another timezone based on your offset.
// Get your timestamp.
date_default_timezone_set($timezone);
答案 2 :(得分:0)
我不得不仔细思考,但我认为这是我正在寻找的解决方案。如果您认为此算法不正确,请与我们联系。
function getLastMidnightForOffset( $minuteOffset ) {
$today = mktime( 0, 0, 0 );
$tomorrow = $today + 86400;
$yesterday = $today - 86400;
$offset = $minuteOffset * 60;
if ( time() + $offset >= $tomorrow ) {
$localMidnight = $tomorrow - $offset;
} elseif ( time() + $offset >= $today ) {
$localMidnight = $today - $offset;
} else {
$localMidnight = $yesterday - $offset;
}
return $localMidnight;
}