【发布时间】:2010-10-17 07:11:29
【问题描述】:
我在使用 php 处理日期/时间时感到困惑。
我想要做的是:当用户访问我的页面时,我询问他的时区,然后在他的时区显示“星期几”。
我不想使用浏览器的日子。 我想在 php 中做这个计算。
这就是我试图实现它的方式:
- 用户输入的时区
- 通过 php time() 函数计算的 Unix 时间戳。
但我不知道如何继续...... 我将如何在这个时区获得“星期几”。
【问题讨论】:
我在使用 php 处理日期/时间时感到困惑。
我想要做的是:当用户访问我的页面时,我询问他的时区,然后在他的时区显示“星期几”。
我不想使用浏览器的日子。 我想在 php 中做这个计算。
这就是我试图实现它的方式:
但我不知道如何继续...... 我将如何在这个时区获得“星期几”。
【问题讨论】:
$myTimezone = date_default_timezone_get();
date_default_timezone_set($userTimezone);
$userDay = date('l', $userTimestamp);
date_default_timezone_set($myTimezone);
这应该可以工作(没有测试它,所以 YMMV)。它的工作原理是存储脚本的当前时区,将其更改为用户指定的时区,从 date() 函数中获取指定时间戳的星期几,然后将脚本的时区设置回开始时的时区.
不过,您可能会有一些使用时区标识符的冒险经历。
【讨论】:
如果您可以获取他们的时区偏移量,您只需将其添加到当前时间戳,然后使用gmdate 函数即可获取他们的本地时间。
// let's say they're in the timezone GMT+10
$theirOffset = 10; // $_GET['offset'] perhaps?
$offsetSeconds = $theirOffset * 3600;
echo gmdate("l", time() + $offsetSeconds);
【讨论】:
“星期几”实际上是您可以直接从 php date() 函数中获取的内容,格式分别为“l”或“N”。看一下 the manual
编辑:对不起,我没有正确阅读 Kalium 的帖子,他已经解释过了。我的错。
【讨论】:
$dw = date( "w", $timestamp);
如您在此处看到的,其中 $dw 将为 0(星期日)到 6(星期六): http://www.php.net/manual/en/function.date.php
【讨论】:
date("N", $timestamp) 从星期一开始获取 1..7 值。在旧版本中,您可以使用技巧 (date("w", $timestamp) + 6) % 7 从星期一开始获取 0..6 值。
非常感谢你们的快速cmets。
这就是我现在要使用的。 在此处发布该功能,以便有人可以使用它。
public function getDayOfWeek($pTimezone)
{
$userDateTimeZone = new DateTimeZone($pTimezone);
$UserDateTime = new DateTime("now", $userDateTimeZone);
$offsetSeconds = $UserDateTime->getOffset();
//echo $offsetSeconds;
return gmdate("l", time() + $offsetSeconds);
}
如果您发现任何更正,请报告。
【讨论】:
另一种快捷方式:
date_default_timezone_set($userTimezone);
echo date("l");
【讨论】:
我的解决办法是这样的:
$tempDate = '2012-07-10';
echo date('l', strtotime( $tempDate));
输出为:Tuesday
$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));
输出为:Tue
【讨论】:
在获取上周一或上周日之前检查日期是周一或周日
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);
}
【讨论】:
基于其他解决方案之一,带有从周日或周一开始在周之间切换的标志
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);
}
【讨论】:
echo date('l', strtotime('today'));
【讨论】:
我认为这是正确的答案,只需将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
【讨论】:
日期部分的基于标准字母的表示非常棒,但它们并不那么直观。更方便的方法是识别基本的抽象和一些具体的实现。此外,通过这种方法,您可以从自动补全中受益。
由于我们在这里讨论的是日期时间,因此基本抽象是ISO8601DateTime 似乎是合理的。具体实现之一是当前日期时间,这是您向后端发出请求时需要的,因此是Now() 类。第二个对您有用的是调整到某个时区的日期时间。毫不奇怪,它被称为AdjustedAccordingToTimeZone。最后,您需要在已通过的日期时间的时区中找到一周中的某一天:为此有一个 LocalDayOfWeek 类。所以代码如下所示:
(new LocalDayOfWeek(
new AdjustedAccordingToTimeZone(
new Now(),
new TimeZoneFromString($_POST['timezone'])
)
))
->value();
有关此方法的更多信息,take a look here。
【讨论】: