我在使用php处理日期/时间时感到困惑。
我想做的是:当用户访问我的页面时,我会问他的时区,然后在他的时区中显示“星期几”。
我不想用浏览器的一天。我想在php中进行此计算。
这就是我试图实现的方式:
- 用户输入的时区
- 通过php time()函数计算的Unix时间戳。
但我不知道该如何进行...在该时区我将如何获得“一周中的某天”。
Answers:
$dw = date( "w", $timestamp);
您可以在此处看到$ dw为0(星期日)到6(星期六)的情况:http : //www.php.net/manual/en/function.date.php
我的解决方案是这样的:
$tempDate = '2012-07-10';
echo date('l', strtotime( $tempDate));
输出为: Tuesday
$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));
输出为: Tue
我认为这是正确的答案,只需更改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/zh/function.date.php
有关受支持的时区的列表,请参见 http://php.net/manual/en/timezones.php
非常感谢您的快速评论。
这就是我现在将要使用的。在此处发布函数,以便有人可以使用它。
public function getDayOfWeek($pTimezone)
{
$userDateTimeZone = new DateTimeZone($pTimezone);
$UserDateTime = new DateTime("now", $userDateTimeZone);
$offsetSeconds = $UserDateTime->getOffset();
//echo $offsetSeconds;
return gmdate("l", time() + $offsetSeconds);
}
报告是否发现任何更正。
支票日期是星期一或星期天,最后一个星期一或星期天之前
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);
}
基于日期部分的基于字母的标准表示非常出色,但事实并非如此直观。更方便的方法是识别基本抽象和许多特定的实现。此外,通过这种方法,您可以受益于自动补全。
由于我们在这里讨论日期时间,因此基本抽象为似乎是合理的ISO8601DateTime
。一种具体的实现是当前日期时间,当a向后端(即Now()
类)发出请求时需要的一种。第二个对您有用的是将日期时间调整为某个时区。毫不奇怪,它叫做AdjustedAccordingToTimeZone
。最后,您需要在经过日期时间的时区中的一周中的某一天:LocalDayOfWeek
为此提供了一个类。因此,代码如下所示:
(new LocalDayOfWeek(
new AdjustedAccordingToTimeZone(
new Now(),
new TimeZoneFromString($_POST['timezone'])
)
))
->value();
有关此方法的更多信息,请在此处查看。
date("N", $timestamp)
获取1..7
值。在较旧的版本中,您可以使用技巧从星期一开始(date("w", $timestamp) + 6) % 7
获取0..6
值。