这是我可以找到定义的情况,但我不太了解它。来自official documentation:
瞬发是以原子秒为单位测量的特定时刻,包含分数。它与任何时代无关或不了解。
我不明白如何在没有纪元的情况下指定特定时刻?它没有参考点吗?在两台不同的Linux机器上,似乎两个Instants都提到自POSIX Epoch以来的几秒钟。我的猜测是Instants确实有一个有效的开始时间,但是开始时间是依赖于实现/设备的。
# machine1
say(now * (1/3600) * (1/24) * (1/365.25)); # years from zero point
46.0748226200715
# machine2
say(now * (1/3600) * (1/24) * (1/365.25)); # years from zero point
46.0748712024946
无论如何,我的问题是,可以依赖Instants在不同进程之间保持一致,还是只用于“内部”使用?
答案 0 :(得分:5)
say (now).WHAT; # «(Instant)»
say (now * 1).WHAT # «(Num)»
任何数值运算符都会将它的操作数强制转换为Num
s。如果您想要正确的字符串表示,请使用.perl
。
say (now).perl # «Instant.from-posix((<1211194481492/833>, 0))»
无论您使用什么平台,Instant.from-posix
都将始终与Unix时代相关。
请参阅:https://github.com/rakudo/rakudo/blob/nom/src/core/Instant.pm#L15
答案 1 :(得分:3)
当前在特定计算机上的所有Instant对象都是可比较的,来自不同计算机的Instants可能不是。
出于实际目的,在POSIX机器上,它目前基于1970年1月1日以来的秒数,根据International Atomic Time (TAI),目前36 seconds Coordinated Universal Time (UTC)之前的{{3}}。 /> (即使您知道您的代码只能在POSIX机器上运行,也不应该依赖它)
在另一个系统上,根据机器开启后的时间量,它可能更有意义 因此,重新启动后,重启之前的任何Instants将无法与之后的任何Instants进行比较。
如果您想比较不同机器的Instants,或将它们存储起来供以后使用,请将其转换为标准值。
您可以使用几种内置转换器
# runtime constant-like term
my \init = INIT now;
say init.to-posix.perl;
# (1454172565.36938, Bool::False)
say init.DateTime.Str; # now.DateTime =~= DateTime.now
# 2016-01-30T16:49:25.369380Z
say init.Date.Str; # now.Date =~= Date.today
# 2016-01-30
say init.DateTime.yyyy-mm-dd eq init.Date.Str;
# True
如果你需要比上面显示的更多,我建议你只使用DateTime对象,因为它有各种有用的方法。
my $now = DateTime.now;
say $now.Str;
# 2016-01-30T11:29:14.928520-06:00
say $now.truncated-to('day').utc.Str;
# 2016-01-30T06:00:00Z
# ^
say $now.utc.truncated-to('day').Str;
# 2016-01-30T00:00:00Z
# ^
Date.today
和DateTime.now
会考虑您当地的时区信息,其中now.Date
和now.DateTime
不能。
如果您真的只想处理POSIX时间,可以使用与time
大致相同的now.to-posix[0].Int
。