2013-10-25 51 views
0

我正在传递一个日期字符串(很可能是ISO8601格式),并且需要将其转换为ISO周的日期以在MySQL中存储为DATETIME列。要初始化DateTime对象的我要救,我做了以下内容:更快捷地从日期字符串中获取ISO星期的日期?

$date = new DateTime("now"); 
$date = new DateTime($date->format("o-\WW")); 

echo $date->format(DateTime::ISO8601) . "\n"; 

由于我使用Doctrine2,我需要通过我的实体DateTime对象。有没有办法避免让2个DateTime对象得到相同的结果?我应该退回到日期函数并将其用作DateTime构造函数的参数吗?

$date = new DateTime(date("o-\WW", strtotime("now")); 
+0

'$日期=新的日期时间(日期戳$>格式(“邻\ WW“)S);'S做什么? –

+0

@HorseSMith没有什么,当我格式化我的问题时,这是一个错字。我已经删除它。 – devNoise

回答

1

您可以使用modify()方法DateTime对象。

$date = new DateTime(); 
$date->modify('sunday this week'); 
echo $date->format(DateTime::ISO8601) . "\n"; 

请注意,如果您希望星期的第一天不是星期天,您可能需要执行以下操作。这个例子认为星期一是一周的第一天,因此对于星期天的日期,您需要从上一周得到星期一的日期。

$date = new DateTime(); 
if ($date->format('D') === 'Sun') { 
    $date->modify('monday last week'); 
} else { 
    $date->modify('monday this week'); 
} 
echo $date->format(DateTime::ISO8601) . "\n"; 
+0

@Glavić指出这个边缘条件是很好的。我不确定这是否是期望的行为。 OP应该考虑他们想要定义的一周中的第一天。它们也应该与任何它们可能用于MySQL的'WEEK()'函数的使用一致,以检索周数,因为正在使用的“模式”会影响预期的结果。我已经更新了我的答案,使这个边缘案例更加清晰。 –

+0

@Glavić你是对的。我从中得到的上下文是他只关心ISO-8601格式,以便更容易地在MySQL中进行记录。从这个问题来看,我并不清楚他是否试图将这一标准应用于本周开始的决心。无论如何,感谢您在这方面加入您的意见,因为OP理解处理周数的不同方式仍然很重要。这也是考虑可能需要发挥的年度障碍,这取决于他如何最终使用MySQL中的星期信息。 –

-1

你或许可以使用date这样的:

$date = new DateTime(date('o-\WW')); 

虽然该格式看起来有点怪。 :p当然,您也可以使用班级提供的其他方法/功能来更改/修改日期。

+0

我刚刚以“now”为例。在我的实际代码中,“now”从请求对象中提取参数。 – devNoise

+0

“现在”在此刻表示正确,而不是更早或更晚的日期,现在是。没有time()参数的<_

2

你可以使用setISODate使用一周和对象的年通过format()更新第一DateTime对象:

$date = new DateTime(); 
$date->setISODate($date->format('o') , $date->format('W')); 
echo $date->format(DateTime::ISO8601); 
+1

'setISODate()'方法的第一个参数应该是ISO年数。如果ISO周数(W)属于上一年或下一年,则应使用当周的年份。很好的例子是2013年12月30日和2013年12月31日,它们已经在2014年的第一周。[见demo](https://eval.in/57726)。 –

+1

谢谢,我更新了代码。我误解了格式字符描述,并认为'Y'返回了ISO年份。意识到潜力,但无论如何都使用了错误的代码。 :p – Anthony

相关问题