Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP最佳实践之日期、时间和时区 #6

Open
xx19941215 opened this issue Jul 20, 2017 · 1 comment
Open

PHP最佳实践之日期、时间和时区 #6

xx19941215 opened this issue Jul 20, 2017 · 1 comment

Comments

@xx19941215
Copy link
Owner

1).自己处理很容易出错,建议使用从PHP5.2之后新增的DateTime、DateInterval和DateTimeZone类。
2).使用date_default_timezone_set('Asia/Shanghai');设置默认时区为中国时区,或者你也可以在php.ini文件中配置。
3).使用DateTime管理时间和日期:

<?php
//没有传入参数返回当前日期和时间的实例
$datetime = new DateTime();
//传入符合规范的时间格式
$datetime = new DateTime('2017-07-14 9:19 AM')
//有时我们必须处理那些不符合规范的时间格式t
$datetime = DateTime::createFromFormat('M j, y H:i:s', 'Jul 14, 2017 09:19:20');

4).DateTime::createFromFormate()静态方法使用的日期格式与date()一样。可以的日期和格式可以参见http://php.net/manual/zh/datetime.createfromformat.php
5).使用DateInterval偏移时间:

<?php
$datetime = new DateTime('2017-07-14 14:00:00');
$interval = new DateInterval('P2W');
$datetime->add($interval);
echo $datetime->format('Y-m-d H:i:s');

有效的周期标志如下:

  • Y(年)
  • M(月)
  • D
  • W
  • H
  • M(分)
  • S
    间隔的周期中M即表示月,又表示分。所以怎么区分呢?前3个表示日期,后面的表示时间,这就需要用字母T来分隔。可以使用T2M表示间隔两秒。
$dateStart = new \DateTime();
$dateInterval = DateInterval::createFromDateString('-1 day');
$datePeriod = new DatePeriod($dateStart, $dateInterval, 3);
foreach ($datePeriod as $date) {
    echo $date->format('Y-m-d'), PHP_EOL;
}

5).DateTimeZone类:

<?php
$timezone = new DateTimeZone('Asia/Shanghai');
$datetime = new DateTime('2017-07-14', $timezone);
//使用setTimeZone()方法修改DateTime实例的时区
$dateTIme->setTimezone(new DateTimeZone('Asia/Hongkong'));

最好是一直使用UTC时间。服务器使用,自己开发默认也是,然后存入数据库也是,这样的话把数据显示给用户看的话转换为适当时区的日期和时间就行了。
6).上面说到的DatePeriod类适合在迭代处理一段时间内反复出现的一系列时期和时间,重复在日程表中记事就是一个很好的例子。
7).nesbot/carbon组件是一个不错的时间组件

@mouyong
Copy link

mouyong commented Nov 24, 2017

做个补充 P 和 T 的意思以及具体用法
http://asika.windspeaker.co/post/3482-php-datetime-modify

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants