如何在特定时区的php中查找星期几
Posted
技术标签:
【中文标题】如何在特定时区的php中查找星期几【英文标题】:How to find day of week in php in a specific timezone 【发布时间】:2010-10-17 07:11:29 【问题描述】:我在使用 php 处理日期/时间时感到困惑。
我想要做的是:当用户访问我的页面时,我询问他的时区,然后在他的时区显示“星期几”。
我不想使用浏览器的日子。 我想在 php 中做这个计算。
这就是我试图实现它的方式:
-
用户输入的时区
通过 php time() 函数计算的 Unix 时间戳。
但我不知道如何继续...... 我将如何在这个时区获得“星期几”。
【问题讨论】:
【参考方案1】:$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);
这应该可以工作(没有测试它,所以 YMMV)。它的工作原理是存储脚本的当前时区,将其更改为用户指定的时区,从 date()
函数中获取指定时间戳的星期几,然后将脚本的时区设置回开始时的时区.
不过,您可能会有一些使用时区标识符的冒险经历。
【讨论】:
【参考方案2】:如果您可以获取他们的时区偏移量,您只需将其添加到当前时间戳,然后使用gmdate 函数即可获取他们的本地时间。
// let's say they're in the timezone GMT+10
$theirOffset = 10; // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);
【讨论】:
【参考方案3】:“星期几”实际上是您可以直接从 php date() 函数中获取的内容,格式分别为“l”或“N”。看一下 the manual
编辑:对不起,我没有正确阅读 Kalium 的帖子,他已经解释过了。我的错。
【讨论】:
【参考方案4】:$dw = date( "w", $timestamp);
如您在此处看到的,其中 $dw 将为 0(星期日)到 6(星期六): http://www.php.net/manual/en/function.date.php
【讨论】:
从 php 5.1.0 开始,您可以使用date("N", $timestamp)
从星期一开始获取 1..7
值。在旧版本中,您可以使用技巧 (date("w", $timestamp) + 6) % 7
从星期一开始获取 0..6
值。
我很困惑。这怎么会有这么多票?问题是如何获取特定时区的星期几,而不是网络服务器的时区,而不是 GMT。这回答了问题的第一部分,但完全忽略了问题的第二部分。
@tfinniga,我认为原因是很多人在搜索如何获得星期几(就像我一样)时会提出这个问题,然后投票,因为它回答了他们的问题:)
请注意,date() 和 mktime() 仅在您在 UNIX 时代(1970 - 2038 / 0x0 - 0x7FFFFFFF 以秒为单位)内移动时才有效。使用新的 PHP“日期和时间相关扩展”
@dav 哇,你可能是对的,但这似乎是一个非常糟糕的理由。我觉得我开始对普通的 php 开发人员产生强烈的看法。【参考方案5】:
非常感谢你们的快速cmets。
这就是我现在要使用的。 在此处发布该功能,以便有人可以使用它。
public function getDayOfWeek($pTimezone)
$userDateTimeZone = new DateTimeZone($pTimezone);
$UserDateTime = new DateTime("now", $userDateTimeZone);
$offsetSeconds = $UserDateTime->getOffset();
//echo $offsetSeconds;
return gmdate("l", time() + $offsetSeconds);
如果您发现任何更正,请报告。
【讨论】:
【参考方案6】:另一种快捷方式:
date_default_timezone_set($userTimezone);
echo date("l");
【讨论】:
【参考方案7】:我的解决办法是这样的:
$tempDate = '2012-07-10';
echo date('l', strtotime( $tempDate));
输出为:Tuesday
$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));
输出为:Tue
【讨论】:
这很好用。我使用了日期('D',strtotime($DATE))。我的 $DATE 变量的格式已经正确。我用它来识别我制作的报告数据库中的 DOW。在跨多个日期进行搜索时,有一点额外的 DOW 缩写很好。【参考方案8】:在获取上周一或上周日之前检查日期是周一或周日
public function getWeek($date)
$date_stamp = strtotime(date('Y-m-d', strtotime($date)));
//check date is sunday or monday
$stamp = date('l', $date_stamp);
$timestamp = strtotime($date);
//start week
if(date('D', $timestamp) == 'Mon')
$week_start = $date;
else
$week_start = date('Y-m-d', strtotime('Last Monday', $date_stamp));
//end week
if($stamp == 'Sunday')
$week_end = $date;
else
$week_end = date('Y-m-d', strtotime('Next Sunday', $date_stamp));
return array($week_start, $week_end);
【讨论】:
虽然这可能有用,但它不能回答问题。【参考方案9】:基于其他解决方案之一,带有从周日或周一开始在周之间切换的标志
function getWeekForDate($date, $weekStartSunday = false)
$timestamp = strtotime($date);
// Week starts on Sunday
if($weekStartSunday)
$start = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Sunday', $timestamp));
$end = (date("D", $timestamp) == 'Sat') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Saturday', $timestamp));
else // Week starts on Monday
$start = (date("D", $timestamp) == 'Mon') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Last Monday', $timestamp));
$end = (date("D", $timestamp) == 'Sun') ? date('Y-m-d', $timestamp) : date('Y-m-d', strtotime('Next Sunday', $timestamp));
return array('start' => $start, 'end' => $end);
【讨论】:
虽然这可能有用,但它不能回答问题。【参考方案10】:echo date('l', strtotime('today'));
【讨论】:
虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案11】:我认为这是正确的答案,只需将Europe/Stockholm
更改为用户时区即可。
$dateTime = new \DateTime(
'now',
new \DateTimeZone('Europe/Stockholm')
);
$day = $dateTime->format('N');
星期几的 ISO-8601 数字表示(在 PHP 5.1.0 中添加) 1(周一)到 7(周日)
http://php.net/manual/en/function.date.php
有关支持的时区列表,请参阅 http://php.net/manual/en/timezones.php
【讨论】:
【参考方案12】:日期部分的基于标准字母的表示非常棒,但它们并不那么直观。更方便的方法是识别基本的抽象和一些具体的实现。此外,通过这种方法,您可以从自动补全中受益。
由于我们在这里讨论的是日期时间,因此基本抽象是ISO8601DateTime
似乎是合理的。具体实现之一是当前日期时间,这是您向后端发出请求时需要的,因此是Now()
类。第二个对您有用的是调整到某个时区的日期时间。毫不奇怪,它被称为AdjustedAccordingToTimeZone
。最后,您需要在已通过的日期时间的时区中找到一周中的某一天:为此有一个 LocalDayOfWeek
类。所以代码如下所示:
(new LocalDayOfWeek(
new AdjustedAccordingToTimeZone(
new Now(),
new TimeZoneFromString($_POST['timezone'])
)
))
->value();
有关此方法的更多信息,take a look here。
【讨论】:
以上是关于如何在特定时区的php中查找星期几的主要内容,如果未能解决你的问题,请参考以下文章
在 datepicker 中选择特定日期时,如何自动填充特定的星期几?
当用户从日期选择器中选择日期时,如何在下拉列表中获取特定的星期几?