2012-09-27 47 views
5

因为我花了大部分时间在php和mysql或pgsql上,所以我会使用DateTime作为日期API的通用字。在php中没有“日期”,“时间”,“日期时间”和“日期时间偏移”我们什么时候选择DateTime作为时间戳

随着我开发Web应用程序越来越精细,我大多数时间使用DateTime,但有时我不知道它是否真的我想要的是。 例如,我只是想显示今天的日期(例如,当我想存储一个论坛或博客文章),没有计算,没有过滤器提供,没有迭代发生......那么为什么我使用\DateTime超过date()函数?

我看到this topic提供了一些简单的描述每种技术的优点。

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

此外,这篇文章说,UNIX_TIMESTAMP从1970年保留但它是不符合逻辑和一些测试证明:

echo date('d/m/Y',time(-1)); 

回声'31/12/1969' 作品!这是合乎逻辑的。一个32位无符号整数从0到4 294 967 295,而且在68年内只有将近20亿的秒数,所以int被签名并且“负时间戳”必须存在!

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

但是,它仍然是一个问题:时区处理。 作为MySQL和其他存储日期为DATETIME时,现在不处理时区,我用的时区集成为一体的“过滤器中逃逸出来”避让部件

$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')); 

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


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

  • 是在2个字节的日期时间在非常简单的使用API​​(仅显示)
  • 的损失,它的时间放弃unix_timestamp?
  • 存储一个简单的时间戳,然后获得良好的本地时间不是更好吗?
+0

可能无关紧要,但'date()'只能工作到2038年。在那一年,'date()'可能会被弃用;-) –

+0

即使在2038年64位系统将是标准?如果不是,将unix时间戳规范从int移植到long int会出现什么问题? – artragis

+0

确实。 JavaScript甚至使用1970年1月1日的毫秒来测量时间。我的猜测是,unix时间戳在这里保持^^ – Johan

回答

3

正如在评论中所说,我认为这主要是个人喜好。在我看来,Unix时间戳和“传统”非OOP接口的使用并不是在当今世界继续前进的方式,例如,我们没有(阅读:不应该)使用INT数据类型在我们的数据库中以Unix Timestamp格式存储日期时,我们应该使用数据库的本机类型,通常是DATEDATETIME类型,它与PHP的DateTime对象(以及其他语言)几乎在标准转换时本地配合。

要详细说明标准转换的含义:当您使用MySQL并将值拉回到PHP时,您将获得一个ISO格式的日期字符串,其中DateTime类在其构造函数中解析为您提供立即可用目的。相比之下,要使用Unix时间戳路由,则必须使用strtotime,然后date将其转换为本机所需的任何格式。

我之前提到过我们的PHP系统和.NET系统之间的互操作。虽然没有使用时间戳导致的具体问题,但它不是实际的解决方案,我们再次使用返回DateTime值的数据库,该数据库可以直接发送到管道。如果我们要将它转换为在PHP中内部使用的unix时间戳,那么如果我们要发送响应或发送对.NET应用程序的响应,我们还必须将其转换回来(或者我应该说API在这种情况下)这是一个时间戳,并在最后进行转换。通过全面使用DateTime,它可以减轻任何转换发生的必要性,并且整个开发过程更加轻松。

最后加入到了这一切,你也在您的文章中提到,你要使用有光泽的物品,如DateInterval,更容易timezoning,更容易操作和简单格式化等,当您使用DateTime和它的相关的面向对象的合作伙伴在犯罪中。这只是我眼中更容易的开发过程。

因为我最初说有一个“正确”的答案,只是更多的是基于自己的编码风格个人喜好,而上述评论反映了我的我不相信。

是2个以上字节的DateTime在非常简单的使用API​​的损失(仅显示)

  • 我不以任何方式这样认为。特别是对于PHP脚本,无论如何通常都是这样短的运行过程。

是放弃unix_timestamp的时候了吗?

是:)

那岂不是更好地存储简单的时间戳,然后得到良好的本地时间?

查看上面关于数据库的注释,为此目的使用Unix时间戳不是“本地”IMO。您可以拨打->getTimezone并将其存储在数据库中,然后在您再次将其拉出时使用->setTimezone

+0

我非常喜欢这个答案。你在某种意义上遵循我的观点。 除此之外,您可能忘记了DateTime :: createFromFormat允许您从unixtimestamp创建日期这一事实(并且您还可以通过format('u')或getTimestamp方法从DateTime对象获取unixtimestamp) – artragis

+0

当然。我认为这个问题也源于这样一个事实,即PHP提供了一百万种不同的方式来执行一项简单的任务。我的主要观点是使用'DateTime'和它的本地构造函数直接从ISO格式化的日期构建一个实例,无论如何你都会回来。这样你就可以直接从实例中读取/写入。要从MySQL读取它作为时间戳,你可以使用'createFromFormat',然后当你将它写入数据库时​​,还必须将其格式化。不必要的开销,国际海事组织。 –

1

不是一个确切的回答你的问题,但我会选择Timestamp超过DateTime,因为我相信Integer值工作更具成本效益(测量CPU的处理时间),而处理DateTime值。

当我有NumbersBinary Machine,而不是StringsObjects,我感觉很舒服。

人类与机器

在易懂的方面,我想,当我正在写一个程序的电脑说,我认为我做的是一个Machine工作不过,如果对该层的抽象可以帮助人们更好地理解,为什么不在Performance不是问题时不使用它?

我不记得是谁说的或我听说的地方,但有人说像People hate Computers, but they should hate Programmers这样的东西,我完全同意这一点。所以,作为一个人,我仍然保持对这台机器的尊重,并且会尝试制作更容易理解计算机的程序。 :)

更新:

要想象的更好,想象我们有一个程序来处理“日期”,处理每分钟10000次,对不对?

// it LOOKS Better 
$date = new DateTime(); 
$date->setDate(1986, 3, 24); // March 24, 1986 
echo $date->format('Y-m-d'); 

// it WORKS Better 
echo date("Y-m-d", mktime(0, 0, 0, 3, 24, 1986)); // March 24, 1986 

让说我看这个代码,每周一小时,让说有10000人,他们应该处理的是全天候的,当然我不会手柄这是一台机器的任务。

顺便说一下,我会再次说,如果Performance不是一个问题,那么为什么我们不让程序员更容易理解呢?如果我们需要从中获得最大收益,那么让程序员看看Works更好的代码,而不是Looks! :)

+1

感谢您的回答。我想说我更喜欢“人们可以理解的写作程序”的观点,因为每个人都可以写一些“可以通过计算机理解”的东西。此外,sql查询结果是一个字符串,这意味着每次在php脚本中处理日期时都会进行转换。而且PHP并不是一个非常经济高效的语言(对于Java或.NET同样) – artragis

+0

@artragis嘿,我已经更新了答案,关于您的评论。 :) – Mahdi

+1

upvoted你的答案,但不接受它。 我的问题是,它真的*一团糟,处理日期,时期等等只有整数。只有整数的计算日期间隔重新发明轮子,但可读性较差 – artragis