洛伦谈MATLAB的艺术

将想法转化为MATLAB

时区和时区偏移

开发部的Peter Perkins写了这篇文章,解释了开发团队和文档需要了解什么,以确保时区得到正确的实施和解释。我偷了它(在他的允许下)与您分享。

在谈论时区时,一个非常常见的错误是将时区与UTC的特定偏移量混淆。这是两件不同的事情。要在MATLAB中了解更多信息,请查看文档.时区包括

  1. 一个名字,像美国/纽约
  2. UTC的标准偏移量,如-5小时
  3. 夏时制时间偏移,比如+1小时
  4. 确定夏时制转换发生时间的两条规则,如“春季提前3月的第二个星期日,回落到11月的第一个星期日,两者都在凌晨2:00”
  5. 随着时间的推移,这四件事的历史,比如“从1987年到2006年,这是4月的第一个星期日,10月的最后一个星期日”,

还有时区偏移,如东部标准时间。这是UTC的偏移量,用于定位特定的时钟面时间。假设有人给你时间戳

时间戳=“2018年11月5日13:58:55”
时间戳='2018年11月5日13:58:55'

这在现实世界中意味着什么?也许你和另一个人有一些约定,但总的来说,你不知道这是指“在纽约”,还是“在伦敦”,或者其他什么。您需要在其上附加一个偏移量以消除歧义,可能如下所示:

时间戳=“2018年11月5日13:58:55-05:00”
时间戳='2018年11月5日13:58:55-05:00'

但是人们更喜欢文字而不是数字,所以通常是这样写的:

时间戳=“2018年11月5日美国东部时间13:58:55”
时间戳='2018年11月5日美国东部时间13:58:55'

只要您同意EST是指美国东部标准时间,而不是澳大利亚或巴西东部标准时间(两者都不是UTC-5,但当地人仍称之为EST),您就可以了。与UTC相差13:58:55,相差-5小时,或18:58:55 UTC。但为什么不避免语言问题(法裔加拿大人称之为HNE)并说“-05:00”。你过得更好。

请注意,所有可以放在datetime数组显示格式中的z/z/x/x内容都会显示时区抵消。时区是datetime数组的一个属性。但每个元素可能会以不同的偏移量显示自己(标准时间与夏令时)。

为一个时间戳提供偏移量(或按约定约定一个偏移量)有助于处理该时间戳,但它不会为算术和计算其他时间戳提供上下文。您可能正在处理在纽约收集的数据,或者处理在Tulum收集的数据(根本不遵守DST).那么,在上述时间戳生效前两天

fmt='dd MMM yyyy HH:mm:ss z';日期时间(“2018年11月5日美国东部时间13:58:55”,“时区”,“美国/纽约”,“格式”,fmt)-小时数(48)
ans=日期时间2018年11月3日美国东部时间14:58:55

日期时间('2018年10月26日13:58:55东部时间',“时区”,“美国/坎昆”,“格式”,fmt)-小时数(48)
ans=日期时间2018年10月24日美国东部时间13:58:55

你可能会说,“哈,图拉姆,我希望但即使在美国,这种情况也会出现。

日期时间('1998年10月26日13:58:55东部时间',“时区”,“美国/纽约”,“格式”,fmt)-小时数(48)
ans=日期时间1998年10月24日美国东部时间14:58:55
日期时间('1998年10月26日13:58:55东部时间',“时区”,“美国/印第安纳波利斯”,“格式”,fmt)-小时数(48)
ans=日期时间1998年10月24日美国东部时间13:58:55

你可能会说,“当然,每个人都会拖出那些陈词滥调”,但这些事情很重要,而且必须是正确的。你猜怎么着?在未来几年,新英格兰的大部分或全部地区可能会改变他们的时区规则,所以你最好习惯于说美国/波士顿之类的话,而不是EST。

我在上面说过-05:00是明确的,比EST好,从语言的角度来看,这是完全正确的。但从上下文的角度来看,它实际上是更多比东部标准时间模棱两可。有很多地方在一年中的某个时间以UTC-5偏移量指定时间。例如,芝加哥,它观察美国所谓的中央标准时间/昼时。而且许多数据采集硬件对DST一无所知,所以它们会吐出时间戳,如26-Oct-1998 13:58:55-05:00终年.您的计算应该尊重这一点,还是尊重纽约的DST规则,或者什么?(MATLAB支持该用例的UTC-5时区——它观察不到DST偏移,从不改变其行为,因此其名称只是其偏移量。)万博1manbetx

那么你呢需要时区。但是如果你只有指定时区(假设您知道这意味着什么,并且没有错误地指定偏移量),如果您不指定偏移量,则会出现问题。考虑这个时间戳

日期时间('2018年11月4日01:35:23',“时区”,“美国/纽约”,“格式”,fmt)
ans=日期时间2018年11月4日01:35:23东部标准时间

但是,这场比赛呢另外01:35:23那天第一夏令时提前一个小时?

在读取数据中的时间戳时,获取这些时间戳的正确方法是要求偏移量。

日期时间('2018年11月4日01:35:23东部时间',“时区”,“美国/纽约”,“格式”,fmt)
ans=日期时间2018年11月4日01:35:23东部标准时间
日期时间('2018年11月4日01:35:23美国东部时间',“时区”,“美国/纽约”,“格式”,fmt)
ans=日期时间2018年11月4日01:35:23美国东部时间

好的,一年一次,半夜,大不了。但这些事情很重要,必须是正确的。你猜怎么着?如果没有偏移量,如果您使用的数据来自不知道DST的数据acq硬件,并且没有在其时间戳中添加偏移量,那么您的数据将减少一半的一小时。

结论:时区和时区偏移量是两件不同的事情。指定偏移量可以为一个时间戳提供精确的含义,但不会为计算提供上下文。除非您使用的是“未分区”“时间戳只有一种可能的含义,并且仅来自一个数据源,您还需要指定时区。而EST不是实现这一点的方法。

你需要掌握时区吗?你有过麻烦吗?让我们知道哪些对您有效,哪些对您无效在这里.




与MATLAB®R2019b一起发布

|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。