span8
span4
日期和时间(合起来称为日期时间)在世界的不同地区是不同的,并根据太阳时间的调整而变化。初级时间标准被调用协调世界时间(也称为UTC)。然而,当地时间标准可能会受到以下因素的影响:
本页包括一系列的例子,说明如何使用FME操作和处理由时区和其他调整引起的日期时间变化。
下面的示例包括工作区和运行它们的数据。它们包括以下主题:
这些例子都是独立的;换句话说,你不需要执行所有的,你可以选择你想要尝试的例子。
从理论上讲,时间在世界上的每个地方都是由当地正午与当地正午在经度为0度时的偏移量来定义的。在实践中,世界的每个部分都在一个指定的范围内时区.
每个时区一个偏移量这是UTC的加减小时数(或分钟数)。
例如,加拿大的温哥华位于太平洋时区(PST或太平洋标准时间)。PST区域比UTC时间晚8个小时,这个偏移量通常以“-08:00”格式显示。所以中午的协调世界时是太平洋时间的“0400000 -08:00”。
同样,日本——使用日本标准时间(JST)——比UTC早9个小时,UTC表示为“+09:00”。所以在UTC的中午,日本是“210000+09:00”。
FME能够在日期时间中解释时间偏移量,并在算术计算中考虑它们。它还可以从日期时间中添加或删除偏移量,或者解析UTC的偏移量。
要创建新的时间戳,可以使用DateTimeStamper转换器。有一个参数用于选择您需要本地时间还是UTC,另一个参数用于表示需要时区偏移。
这里用户用UTC记录当前日期。第二个DateTimeStamper在本地时区记录当前日期时间:
DateTimeConverter用于将结果转换为更易于阅读的格式。输出是这样的:
很容易看出,本地时间和UTC时间之间的差异与偏移量差异(7小时)相匹配。
当FME在虚拟机上运行时(如使用Amazon AWS),需要格外小心。例如,我位于温尼伯(美国中部时间),使用位于弗吉尼亚(美国东部时间)的亚马逊虚拟机处理来自温哥华(太平洋时间)的数据。这个设置的时间戳将是东部时间。
因此,您的计算机的本地时区可能与您的本地时区不同,而本地时区本身可能与数据的时区不同!
另外,如果你既想要UTC时间,又想要本地时间——与上面的例子不同——最好是获得一个datetime,然后将它转换成本地时间(即UTC时间)。解决抵消)。否则,当涉及到秒的几分之一时,秒字段中可能会有细微的差异,并且两个时间不匹配。
等价于DateTimeStamper转换器的FME DateTime函数是@DateTimeNow()
按照以下步骤来尝试附加的示例。
打开工作区,确保功能缓存处于活动状态,然后按Run按钮。检查缓存的结果。
请注意,这两个时间差值与时区偏移量相同。当然,差异的大小将取决于您运行工作区的时区!
对DateTimeStamper变压器的参数进行实验,看看它们的作用。在DateTimeConverter输出格式中包含秒,以查看由不同的转换器创建的UTC和本地时间之间的细微差异(如果有的话)。
在这个例子中,用户有一个datetime属性。目前格式为:
% Y - % m - H % d %: % m: % S
例如:
2019-07-15 15:14:30.59
此属性上没有时区偏移信息。然而,用户知道所有的记录(温哥华市)都与当地的时区(太平洋)有关。
用户希望向其记录中添加时区。由于没有特定的转换器来执行此操作,用户必须使用FME DateTime函数。
用户放置一个AttributeManager转换器来创建一个名为ZonedTime的新属性:
在文本编辑器对话框中,用户已输入以下内容:
@TimeZoneSet (@ value (IssuedDate)、当地、汽车)
TimeZoneSet函数在IssuedDate属性上设置时区。“local”参数告诉FME,这些数据位于用户(或其计算机)的本地时区。
输出是这样的:
其中时区已作为UTC偏移量添加到日期中。还要注意,日期时间已经转换为FME格式。可以使用DateTimeConverter将其转换回先前的格式。
TimeZoneSet参数中的“本地”参数可以被诸如“-08:00”之类的偏移量替换。但是,最好使用本地时区。这是因为夏时制可以考虑(见下文)。同样的原因意味着不建议使用StringConcatenator添加偏移量。
然而,有时一组空间数据代表跨越多个时区的特性。例如,我有一个代表世界首都城市的数据集。我无法为每个时区分配一个固定的时区偏移量,因为每个时区可能位于不同的时区。
在这种情况下,有两个变压器可能会有所帮助。Geocoder转换器和TimeZoneExtractor转换器(来自FME集线器的转换器)都使用谷歌web服务将数据的位置转换为已知的时区偏移。然后可以使用上述函数应用该偏移量,用时区偏移量代替“本地”。
按照以下步骤来尝试附加的示例。
打开工作区模板,确保功能缓存处于活动状态,然后按Run按钮。
检查缓存的结果,以显示IssuedDate属性没有时区偏移,但是ZonedTime属性有时区偏移。
与前面一样,实际的时区取决于运行工作区的时区!由于数据来自温哥华市,您可能应该尝试使用固定偏移量(例如-08:00)。
在这个例子中,用户有一个datetime属性。其当前格式包括本地时间和偏移量,如:
20190715151430.59喂饲
他们希望解决抵消得到时间在UTC,如:
20190715231430.59 + 0
由于没有特定的转换器来执行此操作,用户必须使用FME DateTime函数。
用户放置一个AttributeManager转换器来创建一个名为UTCTime的新属性,并打开文本编辑器对话框:
在文本编辑器对话框中,用户已输入以下内容:
@TimeZoneSet (@ value (ZonedTime), utc,转换)
TimeZoneSet函数在IssuedDate属性上设置时区。“utc”和“convert”参数告诉FME应该将此数据转换为utc。
输出是这样的:
请注意,偏移量已通过从分区时间中减去它来解决。
“源”日期时间必须包含时区偏移。如果没有,则该特性将被拒绝。
使用转换器的替代方法包括提取偏移量(DateTimeConverter),然后从原始日期中减去它(DateTimeCalculator)。TimeZoneSet函数更可取,因为它使用为此特定目的设计的功能,在单个步骤中执行相同的任务。
按照以下步骤来尝试附加的示例。
打开工作区模板,确保功能缓存处于活动状态,然后按Run按钮。
检查缓存的结果,以显示ZonedTime属性有一个本地偏移量,而UTC time属性表示相同的时间,但是采用UTC格式。
这里用户有两个日期。它们是在AttributeCreator transformer中创建的,但是很容易从源数据集读取:
一个日期时间(下午16:43)在UTC时间。另一个时间是太平洋时间上午8点42分。设置DateTimeCalculator transformer计算两个datetimes之间的间隔:
结果的间隔只有60秒。虽然时间(16:43和08:42)之间的差异是8小时1分钟,但DateTimeCalculator考虑了8小时时差(UTC偏移)。结果是,实际上两个日期时间值只需要60秒。
在上面的例子中,如果两个日期时间都未分区(即如果没有偏移量,那么时差就是28,860秒。这是因为,如果没有定义时区,就不会应用时区偏移。
如果只有一个datetime是未分区的(例如一个是PST,另一个是未知的),那么这个特性就会被拒绝。FME将不假设这两个属性属于同一时区。将被拒绝的特性上的interval属性设置为
DateTimeCalculator中属性的顺序很重要。在本例中,如果将UTC日期定义为起始日期时间,则差值为-60秒。如果PST日期被定义为起始日期时间,那么差值就是(+)60秒。
与DateTimeCalculator转换器的间隔模式等价的FME DateTime函数是@DateTimeDiff()
按照以下步骤来尝试附加的示例。
打开工作区,确保功能缓存处于活动状态,然后按Run按钮。
检查缓存的结果,以显示间隔是-60。
对这两个日期使用不同的时间和时区偏移量进行试验。
在一些国家,在夏季开始时,时间向前移动一个小时,然后在冬季开始时又向后移动一个小时。这被称为日光节约时间(DST)。
例如,温哥华时间通常是太平洋标准时间(PST)。夏季是太平洋夏令时(PDT)。
并非所有国家和地区都同时采用夏令时。这就是为什么-例如-如果你在3月或11月注册了一个安全的软件网络研讨会,检查事件的确切时间是一个明亚搏在线智的想法,包括DST状态。
要创建新的时间戳,可以使用DateTimeStamper转换器。有一个参数用于选择您需要本地时间还是UTC,另一个参数用于表示需要时区偏移。
由于协调世界时从不转换为夏令时,因此本地时间和协调世界时之间的偏移在全年都可能变化。这个偏移量已经在时间戳结果中考虑到了。
在这里(使用与前一节相同的示例),用户用UTC记录当前日期。第二个DateTimeStamper在本地时区记录当前日期时间:
结果如下:
虽然PST和UTC之间的差值是8(8)小时,但这里的偏移量记录为7(7)小时。这是因为偏移量包括了日光节约时间(PDT)的计算。
如果工作空间在没有夏令时的一个月内重新运行,比如12月,那么UTC偏移量将记录为-08:00。
这说明FME在创建时间戳时自动处理DST。
与前面的示例一样,当FME在虚拟机上运行时(如使用Amazon AWS),需要格外小心。例如,我位于温尼伯(美国中部时间),使用位于弗吉尼亚(美国东部时间)的亚马逊虚拟机处理来自温哥华(太平洋时间)的数据。这个设置的时间戳将是东部时间。
因此,您的计算机的本地时区可能与您的本地时区不同,而本地时区本身可能与数据的时区不同!这意味着夏令时规则在计算机时区中的操作可能与本地时区不同。
等价于DateTimeStamper转换器的FME DateTime函数是@DateTimeNow()
按照以下步骤来尝试附加的示例。
打开工作区,确保功能缓存处于活动状态,然后按Run按钮。
检查缓存的结果。请注意,时间偏移考虑到了夏令时的差异。本地时间戳将用正确的夏令时UTC的偏移量来创建。
再次,实际区偏移取决于在其中运行的工作区,以及一年的时间的时区!
日期时间算术可以与FME进行,但是当一个日期是夏令时间内发生了什么,但其他日期是不是?
这里用户有两个日期。它们是在AttributeCreator transformer中创建的,但是很容易从源数据集读取:
这两个日期时间在太平洋时区的存在,尽管它们都没有UTC偏差应用。这两个日期是2019年3月10日。一个时间是上午12时三十〇,另一个是上午三时半。
人们很容易认为这两个时间之间的差为三小时(180分钟),并在第一次确认DateTimeCalculator:
然而,日光节约时间开始于02:00上午的那一天,在这一点时钟将被开启快一小时。这意味着实际的时间差是只有两个小时(120分钟)。
所以,当一个UTC偏移被施加到这些日期时间(利用如上所述的TimeZoneSet功能)然后夏令时间被考虑在内,得到正确的结果:
甚至表明,UTC偏差的输出是针对每个日期时间不同。
总之,只要UTC偏移是可用的,则在任何算术运算夏令时间被考虑在内。
正如前面提到的,如果只有一个日期时间过UTC则偏移功能将被拒绝。FME将不假定这两个属性落在同一时区或具有相同的夏令值。将被拒绝的特性上的interval属性设置为
与DateTimeCalculator转换器的间隔模式等价的FME DateTime函数是@DateTimeDiff()
按照以下步骤来尝试附加的示例。
打开工作区,确保功能缓存处于活动状态,然后按Run按钮。
检查每个DateTimeCalculator缓存的结果以示区别时UTC偏差原因夏令被考虑在内。
在很大程度上,这是没有必要,如果你有UTC偏移,因为系统会自动应用的一切,甚至不与DateTimeStamper产生偏移,时间包括差别。同样,如果你加上UTC偏移正确的,那么你不应该需要做到这一点。
但是,在极少数情况下,你确实需要加上或减去一个小时,使用DateTimeCalculator。
这里的FME用户是从日志时,隔夜FME进程启动的测试记录:
他们使用的AttributeManager添加UTC偏移到原来的日期时间。发生在夏季的日期时间有因为夏令时不同的偏移。
然而,用户怀疑的任务调度用于启动过程中忽略夏令时间晚上11点的标准时间全年运行进程。这意味着该进程日志是不正确的夏季。该日期时间需要添加到他们一个小时。
他们成立了DateTimeCalculator - 使用Conditional参数 - 一小时添加到datetime其中偏移两端“-07:00”:
现在,输出显示添加到这些具体的日期时间一小时:
特别值得注意的是,因为另外一小时移动的时间至午夜,日期也翻了个身;例如日期曾经是2016年4月1日,但现在是2016年4月2日。
如果形势逆转,这将是一样容易减去一个小时为添加一个。然而,如所指出的,手动加法或减法,以适应夏令很可能是一种罕见的情况。
FME的DateTime相当于DateTimeCalculator变压器的加/减模式功能是@DateTimeAdd()
按照以下步骤来尝试附加的示例。
打开工作区,确保功能缓存处于活动状态,然后按Run按钮。
检查每个步骤的缓存结果来显示每个阶段的日期时间(无UTC偏移量,与UTC的偏移,用另外的小时)。
注重在DateTimeCalculator条件参数。这是为了避免分离使用测试仪的日期时间的方式。
闰年是做保留天与天文事件,如四季行调整。他们是必要的,因为地球绕太阳运行的轨道是不完全365天,这样的天文事件会在对于日历漂移。
换句话说,这些调整在一年的长度修正变化。他们确保夏季和冬季不漂移到日历的不同部分。
闰秒是做保留时间符合太阳的运动进行调整。特别是他们的目标是保持UTC中午接近正午越好。它们是必要的,因为地球的轨道有不规律,否则会造成UTC和太阳正午之间的差异。
换句话说,这些调整改变了一天的长短。他们确保太阳在中午时处于最高点。
闰年每四年发生一次(有一些例外)。然而,由于一天长度的变化难以预测,闰秒的插入无法安排。
当然,这些调整——无论多么微小——都可能对日期时间测量和计算产生影响。
闰年日期时间以2月29日表示;例如:
2016-02-29 12:00:00-08:00
闰秒日期时间表示一分钟过去六十秒的时间;例如:
2016-12-31 23:59:60-08:00
换句话说,当时间通常从23:59:59前进到2400:00时,在某些点可能会插入一个闰秒,得出23:59:60!
DateTimeStamper转换器与系统时钟对齐,因此只要您的计算机正确处理闰年和闰秒,那么这个FME转换器应该返回那些有效值。
没有包括工作空间,但是在2月29日,下一次有闰年的时候,简单地尝试使用DateTimeStamper。即将到来的闰年是2020年和2024年。千万不要错过它,否则你将不得不再等四年!
您还可以尝试使用DateTimeStamper捕捉闰秒。虽然这些活动的时间间隔不规律,时间也不同,但都是固定的。所以,尽管我们不知道下一个闰秒是什么时候,它将发生在6月30日或12月31日。国际地球自转和参考系统服务(IERS)定期发布关于闰秒的信息。当前公告告诉我们2019年12月31日不会有闰秒。
DateTimeConverter转换器有一个名为Repair Overflow的参数。无效的闰年日期可以通过将该参数设置为Yes来更正。
这里用户有两个日期。一个是有效的闰年日期(2016-02-29),另一个不是(2019-02-29):
用户使用Repair Overflow选项转换这些日期的格式:
结果是无效日期被计算为“溢出”,并滚动到下一个有效日期:
闰秒(23:59:60)也可以滚动到它的下一个有效时间,如果需要,将是00:00:00
与DateTimeConverter转换器等价的FME DateTime函数是@DateTimeCast()、@DateTimeFormat()和@DateTimeParse()。
按照以下步骤来尝试附加的示例。
打开工作区,确保功能缓存处于活动状态,然后按Run按钮。
检查缓存的结果,以证明修复工作。
尝试关闭修复选项,看看结果如何。也可以尝试改变输入日期;例如,如果你尝试20190231(2月31日)会发生什么?
在对日期时间进行算术计算时,FME将自动计算闰年。
这个用户有四个日期:
开始和结束日期都在2月28日到3月1日之间。然而,一个范围是2016年(闰年),另一个是2019年(不是闰年)。
用户使用DateTimeCalculator转换器计算每组日期(以小时为单位)之间的间隔:
2019年的差额将以24小时的形式返回。2016年已将闰年计算在内,其差额为48小时:
FME不会以同样的方式使用闰秒计算时间间隔;即。23:59:59到00:00:00总是只有一秒,即使中间发生了闰秒。这有两个原因:部分是因为没有处理闰秒的标准方法,但主要是因为闰秒在全球同时发生,所以在一天的不同时间在不同的地方!例如(感谢维基百科)2005年12月31日的闰秒23:59:60 UTC发生在美国东部时区2005年12月31日18:59:60。
与DateTimeCalculator转换器的间隔模式等价的FME DateTime函数是@DateTimeDiff()
打开工作区,确保功能缓存处于活动状态,然后按Run按钮。
检查缓存的结果以证明计算是有效的。
用不同的日期进行实验来证明(例如)2016年2月28日到2017年2月28日之间的间隔是366天。
除非另有说明,本系列中使用的数据都来自于温哥华的城市不列颠哥伦比亚省。它包含在开放政府许可下的信息-温哥华。
©2020安全亚搏在线软件公司|法律