Ruby 1.9.3
I would like to convert String datetime to Datetime object in a specific
timezone.
I have
str = '02/21/2013 4:36:53'
then
d = Date.strptime(str, "%m/%d/%Y %H:%M:%S")
can parse the string. And this time object is in UTC. I need to convert
it to Asia/Tokyo
but
p d.in_time_zone('Asia/Tokyo')
gives an error,
undefined method `in_time_zone' for #<Date: 2013-02-21
((2456345j,0s,0n),+0s,2299161j)> (NoMethodError)
I believe the original string has no indication of time zone. So ruby
cannot tell from which time zone it needs to be converted...? but I am
not sure.
Can anyone help me out?
soichi
on 2013-02-26 09:05
on 2013-02-26 10:10
Subject: Date timezone conversion UTC to JST Date: mar 26 feb 13 05:05:53 +0900 Quoting Soichi Ishida (lists@ruby-forum.com): > > > undefined method `in_time_zone' for #<Date: 2013-02-21 > ((2456345j,0s,0n),+0s,2299161j)> (NoMethodError) First of all: the Date class contains only the date (not the time). You may want to explore the DateTime class instead. But then, I read from the documentation of Date that: "All date objects are immutable; hence cannot modify themselves". and I expect this to be true for the DateTime class too. If you want to make time arithmetics, you have to use the Time class, instead. Then: a Time instance is first and foremost a number of seconds since the Epoch (1970-01-01 00:00:00 +0000 (UTC)). Thus: an ABSOLUTE time: p Time::now.to_i 1361868476 The timezone is an IDEA that your specific process has, and in Unix systems it is defined by the content of system variable TZ. For example, the output of: now=Time::now.to_i ENV['TZ']='UTC' p Time::at(now) ENV['TZ']='Asia/Tokyo' p Time::at(now) is: 2013-02-26 08:50:44 +0000 2013-02-26 17:50:44 +0900 I do not know if you want the date to have the Tokyo timezone set, while keeping the time to 4:36, or you want to find out what the Tokyo time was for 4:26 UTC. In the first case, you should do something like: require 'time' ENV['TZ']='Asia/Tokyo' str='02/21/2013 4:36:53' t=Time.strptime(str,"%m/%d/%Y %H:%M:%S") p t which gives 2013-02-21 04:36:53 +0900 If the second possibility is true, you should do this, for example: require 'time' str='02/21/2013 4:36:53' ENV['TZ']='UTC' secs=Time.strptime(str,"%m/%d/%Y %H:%M:%S").to_i ENV['TZ']='Asia/Tokyo' t=Time::at(secs) p t which gives 2013-02-21 13:36:53 +0900 Both objects are Tokyo times, as you can see. If you want to deal with unmutable datetime objects, you can use method Time#to_datetime. Hope this helps Carlo
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.