Lou*_*ell 3 ruby time timezone
ruby 文档声明我可以将 a 传递timezone
给时间初始值设定项:
zone = timezone("Europe/Athens") # Eastern European Time, UTC+2
Time.new(2002, 10, 31, 2, 2, 2, zone) #=> 2002-10-31 02:02:02 +0200
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试打电话时,timezone
我得到了undefined method 'timezone'
。我需要什么特殊要求吗?
你提到的方法timezone
实际上只是一个例子。它在 Ruby 中不存在。我同意,措辞和示例可能有点误导。
Ruby stdlib 通过传递时区 UTC 偏移量或名称将时区作为字符串传递。第一个示例显示了这一点:
您可以传递 UTC 偏移量:
Run Code Online (Sandbox Code Playgroud)Time.new(2002, 10, 31, 2, 2, 2, "+02:00") #=> 2002-10-31 02:02:02 +0200
注意字符串"+02:00"
。
那么你提到的“被指控”的例子:
或者时区对象:
Run Code Online (Sandbox Code Playgroud)zone = timezone("Europe/Athens") # Eastern European Time, UTC+2 Time.new(2002, 10, 31, 2, 2, 2, zone) #=> 2002-10-31 02:02:02 +0200
您应该阅读此示例的方式就好像您在某处有一段代码(这里是假设的方法)timezone
,它返回一个表示可提供给初始化程序的 TZ 的对象。
下面是一个实际示例,使用广泛采用的tzinfo库:
[2] pry(main)> require 'tzinfo'
=> true
[3] pry(main)> tz = TZInfo::Timezone.get('America/New_York')
=> #<TZInfo::DataTimezone: America/New_York>
[4] pry(main)> Time.new(2002, 10, 31, 2, 2, 2, tz)
=> 2002-10-31 02:02:02 -0500
[5] pry(main)> Time.new(2002, 10, 31, 2, 2, 2)
=> 2002-10-31 02:02:02 +0100
Run Code Online (Sandbox Code Playgroud)
请注意在上面的示例中,假设的方法如何timezone
被替换为从 初始化新 TZ 对象的实际代码tzinfo
。
zone
最后,您可以通过调用该对象来访问时区设置Time
。请注意,您获得的内容取决于用于初始化区域的对象。默认情况下它是一个字符串,但如果我tzinfo
像下面的示例一样使用,我会得到 tzinfo 实例。
[6] pry(main)> Time.new(2002, 10, 31, 2, 2, 2, tz).zone
=> #<TZInfo::DataTimezone: America/New_York>
[7] pry(main)> Time.new.zone
=> "CET"
Run Code Online (Sandbox Code Playgroud)
总而言之,没有timezone
定义方法(实际上,按照文档中显示的方式,需要在 中定义它Kernel
,这在 Ruby 中会更奇怪)。这只是一个占位符示例。