小编art*_*gis的帖子

PHP DateInterval是否与DateTime相当?

我发现PHP中的DateTime对象可以与另一个对象进行比较,因为">"和"<"运算符被重载.

和DateInterval一样吗?

当我试图回答这个问题时,我发现了一些奇怪的东西:

<?php 

$today = new DateTime();
$release  = new DateTime('14-02-2012');
$building_time = new DateInterval('P15D');
var_dump($today->diff($release));
var_dump($building_time);
var_dump($today->diff($release)>$building_time);
var_dump($today->diff($release)<$building_time);
if($today->diff($release) < $building_time){
    echo 'oK';
}else{
    echo 'Just a test';
}
Run Code Online (Sandbox Code Playgroud)

它总是呼应"只是一个测试".var_dump输出是:

object(DateInterval)#4 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(18)
  ["h"]=>
  int(16)
  ["i"]=>
  int(49)
  ["s"]=>
  int(19)
  ["invert"]=>
  int(1)
  ["days"]=>
  int(18)
}
object(DateInterval)#3 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(15)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  bool(false)
}
bool(false)
bool(true)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用DateTime作为"01-03-2012"时,一切正常.

php datetime dateinterval

27
推荐指数
4
解决办法
1万
查看次数

我们什么时候选择DateTime而不是Timestamp

由于我将大部分时间花在php和mysql或pgsql上,我将使用DateTime作为日期API的通用词.在PHP中没有"Date","Time","DateTime"和"DateTimeOffset"

随着我开发Web应用程序越来越精细,我大部分时间都使用DateTime,但有时我想知道它是否真的是我想要的.例如,我只想显示今天的日期(例如,当我想存储论坛或博客文章时),没有计算,没有提供过滤器,没有迭代发生...所以我为什么要使用\DateTimedate()功能?

我看到这个主题提供了每种技术的优点的简单描述.

但它并没有真正回答这个问题.在PHP中的DateTime对象和我的数据库中的其他2个字节中抛出2个字节真的是一个损失,因为它允许我使用DATE_INTERVALAPI(在php中DateInterval)和IntlDateFormatter.

此外,这篇文章说unix_timestamp是从1970年开始保留的.但它不符合逻辑,有些测试证明了这一点:

echo date('d/m/Y',time(-1));
Run Code Online (Sandbox Code Playgroud)

回声'31/12/1969'!这是合乎逻辑的.32位无符号整数从0到0 4 294 967 295并且在68年内只有近2亿十亿秒,所以int被签名并且"负时间戳"必须存在!

另一个认为这对我来说非常重要,这让我每次选择DateTime都是为了处理日期,而不是整数.DateTime是一个日期,时间戳不是!我发现时间戳的唯一意义是我想要时间标记文件名的时间,因为在那个cas时间戳时间戳...

然而,仍然是一个问题:时区处理.由于MySQL和其他人在将日期存储为DateTime时不处理时区,目前,我使用TimeZone集成作为"过滤出逃出"的转义部分

$toStoreDate = new \DateTime($_POST['date'],new DateTimeZone('UTC'));
$dao->exec('INSERT INTO mytable(mydate) VALUES (\''.$toStoreDate->format('Y-m-d h:i:s').'\')');
$toDisplayDate =new \DateTime( $dao->query('SELECT mydate FROM mytable')
    ->fetch(DAO::FETCH_ASSOC)['mydate']);
$toDisplayDate->setTimeZone(new DateTimeZone('myLocal'));
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?存储一个简单的时间戳然后获得当地时间不是更好吗?


所以,这里是一个问题的总结:

  • 更简单地使用API​​(仅显示)会导致DateTime的2个字节丢失吗?
  • 是时候放弃unix_timestamp了吗?
  • 存储一个简单的时间戳然后获得当地时间不是更好吗?

php mysql sql datetime unix-timestamp

6
推荐指数
1
解决办法
2035
查看次数

标签 统计

datetime ×2

php ×2

dateinterval ×1

mysql ×1

sql ×1

unix-timestamp ×1