0
0

在PHP和pgsql里取年周的问题(isoyear)

Liút 发表于 2009年12月28日 01:28 | Hits: 3028
Tag: PHP | PostgreSQL | date | pgsql

有个数据库(基于PostgreSQL)的表是按年+第几周分期建的,计划任务是提前一周建立未来两周的表。今天发现在200952后出现的表名是201053,而正确的表名应该是200953(2009第53周)。

在PHPdate手册中有这样的描述:

ISO-8601 year number. This has the same value as Y, except that if theISOweek number (W) belongs to the previous or next year, that year is used instead. (added inPHP5.1.0)

参考:http://php.net/manual/en/function.date.php

取某个日期是年的第几周有几种实现,在PHP中我用date(‘oW’),这样结果正确的。但是在PostgreSQL中(有少量的function实例)我错用了参数year,查了手册才知道有个isoyear参数用来替代year。

ISO8601标准里,以1月4日所在的那个星期为当年的第一个星期。也就是说:最晚会到一年的一月3号,这一天算做上一年的最后一周(第53周)内;其余情况下,一月年份里加上前一年剩余部分算做当年第一周,这也是为什么有的年份有52周,有的有53周。

如:2006-01-01是05年52周;2007-12-31是08年第1周;

SELECT '_' || EXTRACT(isoyear FROM '2010-01-03'::date)
 || TO_CHAR(EXTRACT(week FROM '2010-01-03'::date),'FM09')
-- 结果为 "_200953"
SELECT '_' || EXTRACT(isoyear FROM '2010-01-04'::date)
 || TO_CHAR(EXTRACT(week FROM '2010-01-04'::date),'FM09')
-- 第二天的结果为 "_201001"
-- 为了使字符对齐我用了to_char函数

PHP实现则相对较简单:

echo date('oW', strtotime('2010-01-01')),PHP_EOL;
// 200953
echo date('oW', strtotime('2010-01-05')),PHP_EOL;
// 201001

原文链接: http://liut.cc/blog/2009/12/php_pgsql_isoyear_week.html

0     0

我要给这篇文章打分:

可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.

评价列表(0)