Time
class Time
Parent:ObjectIncluded modules:Comparable
time.rb
当需要'time'时,时间通过附加的解析和转换时间的方法进行扩展。
特征
该库使用日期字符串和时间对象之间的以下转换扩展了Time类:
- 日期时间由RFC 2822定义
- 由RFC 2616定义的HTTP日期
- 由XML Schema第2部分定义的dateTime:数据类型(ISO 8601)
- 由Date._parse处理各种格式
- 由Date._strptime处理的自定义格式
示例
所有示例假定您已将Time加载到:
require 'time'
所有这些例子都是使用GMT-5的EST时区完成的。
转换为字符串
t = Time.now
t.iso8601 # => "2011-10-05T22:26:12-04:00"
t.rfc2822 # => "Wed, 05 Oct 2011 22:26:12 -0400"
t.httpdate # => "Thu, 06 Oct 2011 02:26:12 GMT"
::parse
解析需要一个时间的字符串表示,并尝试使用启发式来解析。
Time.parse("2010-10-31") #=> 2010-10-31 00:00:00 -0500
根据当前日期推断任何缺失的日期片段。
# assuming the current date is "2011-10-31"
Time.parse("12:00") #=> 2011-10-31 12:00:00 -0500
我们可以通过传递第二个响应mon,day和year的对象(如Date,Time或DateTime)来更改用于推断缺失元素的日期。我们也可以使用我们自己的对象。
class MyDate
attr_reader :mon, :day, :year
def initialize(mon, day, year)
@mon, @day, @year = mon, day, year
end
end
d = Date.parse("2010-10-28")
t = Time.parse("2010-10-29")
dt = DateTime.parse("2010-10-30")
md = MyDate.new(10,31,2010)
Time.parse("12:00", d) #=> 2010-10-28 12:00:00 -0500
Time.parse("12:00", t) #=> 2010-10-29 12:00:00 -0500
Time.parse("12:00", dt) #=> 2010-10-30 12:00:00 -0500
Time.parse("12:00", md) #=> 2010-10-31 12:00:00 -0500
解析也接受一个可选块。您可以使用此块指定如何处理日期的年份部分。这是专门为处理两位数年份而设计的。例如,如果你想在2000年之前把70年前的所有两位数字年对待,你可以写下这样的话:
Time.parse("01-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
#=> 2001-10-31 00:00:00 -0500
Time.parse("70-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
#=> 1970-10-31 00:00:00 -0500
::strptime
strptime的工作方式类似,parse
除了使用启发式来检测输入字符串的格式,您提供了第二个参数来描述字符串的格式。例如:
Time.strptime("2000-10-31", "%Y-%m-%d") #=> 2000-10-31 00:00:00 -0500
时间是日期和时间的抽象。时间在内部存储为秒分数,因为数时代
,1970年1月1日00:00 UTC。另请参阅库模块Date。Time类将GMT(格林威治标准时间)和UTC(协调世界时)视为等同。GMT是引用这些基准时间的较早方式,但仍然存在于POSIX系统上的调用名称中。
所有时间可能都有分数。当比较彼此时间时要注意这一事实 - 在显示时显然相同的时间在比较时可能不同。
从Ruby 1.9.2开始,Time实现使用带符号的63位整数Bignum或Rational。整数是从Epoch开始
的纳秒数,它可以表示1823-11-12到2116-02-20。当使用Bignum或Rational(1823年之前,2116之后,纳秒)时,Time与使用整数时相比运行速度更慢。
示例
所有这些例子都是使用GMT-5的EST时区完成的。
创建一个新的时间实例
您可以使用::new创建一个新的Time实例。这将使用当前的系统时间。::现在是这个的别名。您也可以将部分时间传递给::new,如年,月,分等。如果您想以这种方式构建时间,您必须至少通过一年。如果你没有其他时间通过这一年,那么当前系统时区将在00:00:00的默认时间为1月1日。这里有些例子:
Time.new(2002) #=> 2002-01-01 00:00:00 -0500
Time.new(2002, 10) #=> 2002-10-01 00:00:00 -0500
Time.new(2002, 10, 31) #=> 2002-10-31 00:00:00 -0500
Time.new(2002, 10, 31, 2, 2, 2, "+02:00") #=> 2002-10-31 02:02:02 +0200
您也可以使用gm,local和utc来推断GMT,本地和UTC时区,而不是使用当前的系统设置。
你还可以使用::at创建一个新的时间,这个时间从Unix Epoch开始的秒数(或小数秒)。
Time.at(628232400) #=> 1989-11-28 00:00:00 -0500
使用Time的实例
一旦你有一个时间实例,你可以用它做很多事情。以下是一些例子。对于以下所有示例,我们将假设您已完成以下工作:
t = Time.new(1993, 02, 24, 12, 0, 0, "+09:00")
Was that a monday?
t.monday? #=> false
What year was that again?
t.year #=> 1993
Was it daylight savings at the time?
t.dst? #=> false
What's the day a year later?
t + (60*60*24*365) #=> 1994-02-24 12:00:00 +0900
How many seconds was that since the Unix Epoch?
t.to_i #=> 730522800
You can also do standard functions like compare two times.
t1 = Time.new(2010)
t2 = Time.new(2011)
t1 == t2 #=> false
t1 == t1 #=> true
t1 < t2 #=> true
t1 > t2 #=> false
Time.new(2010,10,31).between?(t1, t2) #=> true
公共类别方法
at(time) → time Show source
at(seconds_with_frac) → time
at(seconds, microseconds_with_frac) → time
创建与给定的值一个新的时间对象time
,给定数量的seconds_with_frac
,或seconds
与microseconds_with_frac
自纪元。seconds_with_frac
并且microseconds_with_frac
可以是Integer,Float,Rational或其他数字。非便携式功能允许某些系统上的偏移量为负值。
如果给出数字参数,则结果是在本地时间。
Time.at(0) #=> 1969-12-31 18:00:00 -0600
Time.at(Time.at(0)) #=> 1969-12-31 18:00:00 -0600
Time.at(946702800) #=> 1999-12-31 23:00:00 -0600
Time.at(-284061600) #=> 1960-12-31 00:00:00 -0600
Time.at(946684800.2).usec #=> 200000
Time.at(946684800, 123456.789).nsec #=> 123456789
static VALUE
time_s_at(int argc, VALUE *argv, VALUE klass)
{
VALUE time, t;
wideval_t timew;
if (rb_scan_args(argc, argv, "11", &time, &t) == 2) {
time = num_exact(time
t = num_exact(t
timew = wadd(rb_time_magnify(v2w(time)), wmulquoll(v2w(t), TIME_SCALE, 1000000)
t = time_new_timew(klass, timew
}
else if (IsTimeval(time)) {
struct time_object *tobj, *tobj2;
GetTimeval(time, tobj
t = time_new_timew(klass, tobj->timew
GetTimeval(t, tobj2
TIME_COPY_GMT(tobj2, tobj
}
else {
timew = rb_time_magnify(v2w(num_exact(time))
t = time_new_timew(klass, timew
}
return t;
}
gm(year) → time Show source
gm(year, month) → time
gm(year, month, day) → time
gm(year, month, day, hour) → time
gm(year, month, day, hour, min) → time
gm(year, month, day, hour, min, sec_with_frac) → time
gm(year, month, day, hour, min, sec, usec_with_frac) → time
gm(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) → time
根据给定值创建Time对象,解释为UTC(GMT)。年份必须指定。其他值默认为该字段的最小值(可以是nil
或可以省略)。月份可能由1到12的数字或3个字母的英文月份名称指定。小时在24小时制(0..23)上指定。如果任何值超出范围,则引发参数错误。还将接受#to_a输出的顺序中的十个参数。
sec_with_frac
和usec_with_frac
可以有一个小数部分。
Time.utc(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
static VALUE
time_s_mkutc(int argc, VALUE *argv, VALUE klass)
{
return time_utc_or_local(argc, argv, TRUE, klass
}
httpdate(date) Show source
解析date
为RFC 2616定义的HTTP日期,并将其转换为Time对象。
如果date
不符合RFC 2616或者Time类不能表示指定的日期,则引发ArgumentError 。
有关此格式的更多信息,请参阅httpdate。
你必须要求'time'来使用这种方法。
# File lib/time.rb, line 522
def httpdate(date)
if /\A\s*
(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20
(\d{2})\x20
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
(\d{4})\x20
(\d{2}):(\d{2}):(\d{2})\x20
GMT
\s*\z/ix =~ date
self.rfc2822(date).utc
elsif /\A\s*
(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\x20
(\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d)\x20
(\d\d):(\d\d):(\d\d)\x20
GMT
\s*\z/ix =~ date
year = $3.to_i
if year < 50
year += 2000
else
year += 1900
end
self.utc(year, $2, $1.to_i, $4.to_i, $5.to_i, $6.to_i)
elsif /\A\s*
(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
(\d\d|\x20\d)\x20
(\d\d):(\d\d):(\d\d)\x20
(\d{4})
\s*\z/ix =~ date
self.utc($6.to_i, MonthValue[$1.upcase], $2.to_i,
$3.to_i, $4.to_i, $5.to_i)
else
raise ArgumentError.new("not RFC 2616 compliant date: #{date.inspect}")
end
end
iso8601(date)
别名为:xmlschema
json_create(object) Show source
通过将时间自时代转换为时间来反序列化JSON字符串
# File ext/json/lib/json/add/time.rb, line 9
def self.json_create(object)
if usec = object.delete('u') # used to be tv_usec -> tv_nsec
object['n'] = usec * 1000
end
if method_defined?(:tv_nsec)
at(object['s'], Rational(object['n'], 1000))
else
at(object['s'], object['n'] / 1000)
end
end
local(year) → time Show source
local(year, month) → time
local(year, month, day) → time
local(year, month, day, hour) → time
local(year, month, day, hour, min) → time
local(year, month, day, hour, min, sec_with_frac) → time
local(year, month, day, hour, min, sec, usec_with_frac) → time
local(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) → time
Same as ::gm, but interprets the values in the local time zone.
Time.local(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 -0600
static VALUE
time_s_mktime(int argc, VALUE *argv, VALUE klass)
{
return time_utc_or_local(argc, argv, FALSE, klass
}
mktime(year) → time Show source
mktime(year, month) → time
mktime(year, month, day) → time
mktime(year, month, day, hour) → time
mktime(year, month, day, hour, min) → time
mktime(year, month, day, hour, min, sec_with_frac) → time
mktime(year, month, day, hour, min, sec, usec_with_frac) → time
mktime(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) → time
与::gm相同,但解释本地时区中的值。
Time.local(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 -0600
static VALUE
time_s_mktime(int argc, VALUE *argv, VALUE klass)
{
return time_utc_or_local(argc, argv, FALSE, klass
}
new → time Show source
new(year, month=nil, day=nil, hour=nil, min=nil, sec=nil, utc_offset=nil) → time
Returns a Time object.
如果没有给出参数,它将被初始化为当前系统时间。
注意:
新对象将使用系统时钟上可用的分辨率,并可能包含小数秒。
如果指定了一个或多个参数,则时间将初始化为指定的时间。
sec
如果它是理性的,可能会有分数。
utc_offset
是UTC的偏移量。它可以是诸如“+09:00”之类的字符串或诸如32400之类的秒数。
a = Time.new #=> 2007-11-19 07:50:02 -0600
b = Time.new #=> 2007-11-19 07:50:02 -0600
a == b #=> false
"%.6f" % a.to_f #=> "1195480202.282373"
"%.6f" % b.to_f #=> "1195480202.283415"
Time.new(2008,6,21, 13,30,0, "+09:00") #=> 2008-06-21 13:30:00 +0900
# A trip for RubyConf 2007
t1 = Time.new(2007,11,1,15,25,0, "+09:00") # JST (Narita)
t2 = Time.new(2007,11,1,12, 5,0, "-05:00") # CDT (Minneapolis)
t3 = Time.new(2007,11,1,13,25,0, "-05:00") # CDT (Minneapolis)
t4 = Time.new(2007,11,1,16,53,0, "-04:00") # EDT (Charlotte)
t5 = Time.new(2007,11,5, 9,24,0, "-05:00") # EST (Charlotte)
t6 = Time.new(2007,11,5,11,21,0, "-05:00") # EST (Detroit)
t7 = Time.new(2007,11,5,13,45,0, "-05:00") # EST (Detroit)
t8 = Time.new(2007,11,6,17,10,0, "+09:00") # JST (Narita)
p((t2-t1)/3600.0) #=> 10.666666666666666
p((t4-t3)/3600.0) #=> 2.466666666666667
p((t6-t5)/3600.0) #=> 1.95
p((t8-t7)/3600.0) #=> 13.416666666666666
static VALUE
time_init(int argc, VALUE *argv, VALUE time)
{
if (argc == 0)
return time_init_0(time
else
return time_init_1(argc, argv, time
}
now → time Show source
为当前时间创建一个新的时间对象。这与不带参数的new相同。
Time.now #=> 2009-06-24 12:39:54 +0900
static VALUE
time_s_now(VALUE klass)
{
return rb_class_new_instance(0, NULL, klass
}
parse(date, now=self.now) { |year| ... } Show source
date
使用Date._parse 解析并将其转换为Time对象。
如果给出了一个块,那么所描述的年份将date
被该块转换。例如:
Time.parse(...) {|y| 0 <= y && y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
如果给定时间的上层组件被破坏或丢失,那么它们将被提供now
。对于较低的组件,如果损坏或丢失,则假定最小值(1或0)。例如:
# Suppose it is "Thu Nov 29 14:33:20 2001" now and
# your time zone is EST which is GMT-5.
now = Time.parse("Thu Nov 29 14:33:20 2001")
Time.parse("16:30", now) #=> 2001-11-29 16:30:00 -0500
Time.parse("7/23", now) #=> 2001-07-23 00:00:00 -0500
Time.parse("Aug 31", now) #=> 2001-08-31 00:00:00 -0500
Time.parse("Aug 2000", now) #=> 2000-08-01 00:00:00 -0500
由于世界各地在本地定义的时区缩写之间存在许多冲突,因此此方法无意理解所有这些缩写。例如,缩写“CST”被不同地用作:
-06:00 in America/Chicago,
-05:00 in America/Havana,
+08:00 in Asia/Harbin,
+09:30 in Australia/Darwin,
+10:30 in Australia/Adelaide,
etc.
基于这一事实,此方法仅按照RFC 822中描述的时区缩写和系统时区,按命名顺序。(即RFC 822中的定义覆盖系统时区定义。)系统时区取自Time.local(year, 1, 1).zone
和Time.local(year, 7, 1).zone
。如果提取的时区缩写与它们中的任何一个不匹配,则忽略它并将给定时间视为当地时间。
如果Date._parse无法从中提取信息,date
或者Time类无法表示指定日期,则会引发ArgumentError 。
此方法可用作其他解析方法的故障安全,如下所示:
Time.rfc2822(date) rescue Time.parse(date)
Time.httpdate(date) rescue Time.parse(date)
Time.xmlschema(date) rescue Time.parse(date)
但是,应该检查::parse的失败。
你必须要求'time'来使用这种方法。
# File lib/time.rb, line 364
def parse(date, now=self.now)
comp = !block_given?
d = Date._parse(date, comp)
year = d[:year]
year = yield(year) if year && !comp
make_time(date, year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
end
rfc2822(date) Show source
date
按照RFC 2822定义的日期时间解析并将其转换为Time对象。格式与RFC 822定义的日期格式相同,并由RFC 1123更新。
如果date
不符合RFC 2822或者Time类不能表示指定的日期,则引发ArgumentError 。
有关此格式的更多信息,请参阅rfc2822。
你必须要求'time'来使用这种方法。
# File lib/time.rb, line 469
def rfc2822(date)
if /\A\s*
(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)?
(\d{1,2})\s+
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
(\d{2,})\s+
(\d{2})\s*
:\s*(\d{2})\s*
(?::\s*(\d{2}))?\s+
([+-]\d{4}|
UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date
# Since RFC 2822 permit comments, the regexp has no right anchor.
day = $1.to_i
mon = MonthValue[$2.upcase]
year = $3.to_i
short_year_p = $3.length <= 3
hour = $4.to_i
min = $5.to_i
sec = $6 ? $6.to_i : 0
zone = $7
if short_year_p
# following year completion is compliant with RFC 2822.
year = if year < 50
2000 + year
else
1900 + year
end
end
off = zone_offset(zone)
year, mon, day, hour, min, sec =
apply_offset(year, mon, day, hour, min, sec, off)
t = self.utc(year, mon, day, hour, min, sec)
force_zone!(t, zone, off)
t
else
raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}")
end
end
另外别名为:rfc822
rfc822(date)
别名为:rfc2822
strptime(date, format, now=self.now) { |year| ... } Show source
date
使用Date._strptime 解析并将其转换为Time对象。
如果给出了一个块,那么所描述的年份将date
被该块转换。例如:
Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
以下是格式选项的列表:
%a
缩写周日名称(“Sun”)
%A
完整的星期几名称(“Sunday”)
%b
缩写月份名称(“Jan”)
%B
完整的月份名称(“January”)
%c
首选的本地日期和时间表示
%C
Century (20 in 2009)
%d
Day of the month (01..31)
%D
Date (%m/%d/%y)
%e
Day of the month, blank-padded ( 1..31)
%F
等同于%Y-%m-%d(ISO 8601日期格式)
%h
相当于%b
%H
当天的小时,24小时制(00..23)
%I
当天的小时,12小时制(01..12)
%j
年的一天(001..366)
%k
小时,24小时制,空白填充(0..23)
%l
小时,12小时制,空白填充(0..12)
%L
第二秒的毫秒(000..999)
%m
一年中的月份(01..12)
%M
小时(00..59)
%n
Newline (n)
%N
小数秒位数,默认值是9位数(纳秒)
%3N
millisecond (3 digits)
%6N
microsecond (6 digits)
%9N
nanosecond (9 digits)
%p
子午指示符(“AM”或“PM”)
%P
子午指示符(“am”或“pm”)
%r
time, 12-hour (same as %I:%M:%S %p)
%R
time, 24-hour (%H:%M)
%s
自1970-01-01 00:00:00 UTC以来的秒数。
%S
第二分钟(00..60)
%t
制表符(t)
%T
time, 24-hour (%H:%M:%S)
%u
星期几为小数,星期一为1.(1..7)
%U
当年的周数,从第一个星期的第一周开始(00..53)
%v
VMS date (%e-%b-%Y)
%V
根据ISO 8601(01..53)的年数
%W
当年的周数,从第一个星期一开始,作为第一周的第一天(00..53)
%w
星期几(星期日是0,0..6)
%x
仅限日期的优先表示,没有时间
%X
单独的时间的优先表示,没有日期
%y
没有世纪的一年(00..99)
%Y
如果提供,可能包括世纪的年份
%z
Time zone as hour offset from UTC (e.g. +0900)
%Z
Time zone name
%%
Literal “%” character
# File lib/time.rb, line 430
def strptime(date, format, now=self.now)
d = Date._strptime(date, format)
raise ArgumentError, "invalid strptime format - `#{format}'" unless d
if seconds = d[:seconds]
if sec_fraction = d[:sec_fraction]
usec = sec_fraction * 1000000
usec *= -1 if seconds < 0
else
usec = 0
end
t = Time.at(seconds, usec)
if zone = d[:zone]
force_zone!(t, zone)
end
else
year = d[:year]
year = yield(year) if year && block_given?
t = make_time(date, year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
end
t
end
utc(year) → time Show source
utc(year, month) → time
utc(year, month, day) → time
utc(year, month, day, hour) → time
utc(year, month, day, hour, min) → time
utc(year, month, day, hour, min, sec_with_frac) → time
utc(year, month, day, hour, min, sec, usec_with_frac) → time
utc(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) → time
根据给定值创建Time对象,解释为UTC(GMT)。年份必须指定。其他值默认为该字段的最小值(可以是nil
或可以省略)。月份可能由1到12的数字或3个字母的英文月份名称指定。小时在24小时制(0..23)上指定。如果任何值超出范围,则引发参数错误。还将接受#to_a输出的顺序中的十个参数。
sec_with_frac
和usec_with_frac
可以有一个小数部分。
Time.utc(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
static VALUE
time_s_mkutc(int argc, VALUE *argv, VALUE klass)
{
return time_utc_or_local(argc, argv, TRUE, klass
}
w3cdtf(date) Show source
此方法将W3CDTF字符串日期/时间格式转换为Time对象。
W3CDTF格式在此定义:www.w3.org/TR/NOTE-datetime
Time.w3cdtf('2003-02-15T13:50:05-05:00')
# => 2003-02-15 10:50:05 -0800
Time.w3cdtf('2003-02-15T13:50:05-05:00').class
# => Time
# File lib/rss/rss.rb, line 14
def w3cdtf(date)
if /\A\s*
(-?\d+)-(\d\d)-(\d\d)
(?:T
(\d\d):(\d\d)(?::(\d\d))?
(\.\d+)?
(Z|[+-]\d\d:\d\d)?)?
\s*\z/ix =~ date and (($5 and $8) or (!$5 and !$8))
datetime = [$1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i]
usec = 0
usec = $7.to_f * 1000000 if $7
zone = $8
if zone
off = zone_offset(zone, datetime[0])
datetime = apply_offset(*(datetime + [off]))
datetime << usec
time = Time.utc(*datetime)
force_zone!(time, zone, off)
time
else
datetime << usec
Time.local(*datetime)
end
else
raise ArgumentError.new("invalid date: #{date.inspect}")
end
end
xmlschema(date) Show source
解析date
为XML Schema定义的date
Time并将其转换为Time对象。格式是ISO 8601定义格式的限制版本。
如果date
不符合格式,或者Time类不能表示指定的日期,则引发ArgumentError 。
有关此格式的更多信息,请参阅xmlschema。
你必须要求'time'来使用这种方法。
# File lib/time.rb, line 571
def xmlschema(date)
if /\A\s*
(-?\d+)-(\d\d)-(\d\d)
T
(\d\d):(\d\d):(\d\d)
(\.\d+)?
(Z|[+-]\d\d:\d\d)?
\s*\z/ix =~ date
year = $1.to_i
mon = $2.to_i
day = $3.to_i
hour = $4.to_i
min = $5.to_i
sec = $6.to_i
usec = 0
if $7
usec = Rational($7) * 1000000
end
if $8
zone = $8
off = zone_offset(zone)
year, mon, day, hour, min, sec =
apply_offset(year, mon, day, hour, min, sec, off)
t = self.utc(year, mon, day, hour, min, sec, usec)
force_zone!(t, zone, off)
t
else
self.local(year, mon, day, hour, min, sec, usec)
end
else
raise ArgumentError.new("invalid date: #{date.inspect}")
end
end
另外别名为:iso8601
zone_offset(zone, year=self.now.year) Show source
返回指定时区与UTC不同的秒数。
数字时区,其中包括分钟,如-10:00
或+1330
将工作,像简单的意志仅一小时的时区-10
或+13
。
在ZoneOffset中列出的文本时区也受支持。
如果时区与上述任何一项不符,zone_offset
则会检查本地时区(包含和不包含潜在夏时制时间更改生效)是否匹配zone
。指定值year
将改变用于查找本地时区的年份。
如果zone_offset
无法确定偏移量,则返回零。
# File lib/time.rb, line 133
def zone_offset(zone, year=self.now.year)
off = nil
zone = zone.upcase
if /\A([+-])(\d\d):?(\d\d)\z/ =~ zone
off = ($1 == '-' ? -1 : 1) * ($2.to_i * 60 + $3.to_i) * 60
elsif /\A[+-]\d\d\z/ =~ zone
off = zone.to_i * 3600
elsif ZoneOffset.include?(zone)
off = ZoneOffset[zone] * 3600
elsif ((t = self.local(year, 1, 1)).zone.upcase == zone rescue false)
off = t.utc_offset
elsif ((t = self.local(year, 7, 1)).zone.upcase == zone rescue false)
off = t.utc_offset
end
off
end
私有类别方法
apply_offset(year, mon, day, hour, min, sec, off) Show source
# File lib/time.rb, line 207
def apply_offset(year, mon, day, hour, min, sec, off)
if off < 0
off = -off
off, o = off.divmod(60)
if o != 0 then sec += o; o, sec = sec.divmod(60 off += o end
off, o = off.divmod(60)
if o != 0 then min += o; o, min = min.divmod(60 off += o end
off, o = off.divmod(24)
if o != 0 then hour += o; o, hour = hour.divmod(24 off += o end
if off != 0
day += off
days = month_days(year, mon)
if days and days < day
mon += 1
if 12 < mon
mon = 1
year += 1
end
day = 1
end
end
elsif 0 < off
off, o = off.divmod(60)
if o != 0 then sec -= o; o, sec = sec.divmod(60 off -= o end
off, o = off.divmod(60)
if o != 0 then min -= o; o, min = min.divmod(60 off -= o end
off, o = off.divmod(24)
if o != 0 then hour -= o; o, hour = hour.divmod(24 off -= o end
if off != 0 then
day -= off
if day < 1
mon -= 1
if mon < 1
year -= 1
mon = 12
end
day = month_days(year, mon)
end
end
end
return year, mon, day, hour, min, sec
end
force_zone!(t, zone, offset=nil) Show source
# File lib/time.rb, line 178
def force_zone!(t, zone, offset=nil)
if zone_utc?(zone)
t.utc
elsif offset ||= zone_offset(zone)
# Prefer the local timezone over the fixed offset timezone because
# the former is a real timezone and latter is an artificial timezone.
t.localtime
if t.utc_offset != offset
# Use the fixed offset timezone only if the local timezone cannot
# represent the given offset.
t.localtime(offset)
end
else
t.localtime
end
end
make_time(date, year, mon, day, hour, min, sec, sec_fraction, zone, now) Show source
# File lib/time.rb, line 251
def make_time(date, year, mon, day, hour, min, sec, sec_fraction, zone, now)
if !year && !mon && !day && !hour && !min && !sec && !sec_fraction
raise ArgumentError, "no time information in #{date.inspect}"
end
off = nil
if year || now
off_year = year || now.year
off = zone_offset(zone, off_year) if zone
end
if now
if off
now = now.getlocal(off) if now.utc_offset != off
else
now = now.getlocal
end
end
usec = nil
usec = sec_fraction * 1000000 if sec_fraction
if now
begin
break if year; year = now.year
break if mon; mon = now.mon
break if day; day = now.day
break if hour; hour = now.hour
break if min; min = now.min
break if sec; sec = now.sec
break if sec_fraction; usec = now.tv_usec
end until true
end
year ||= 1970
mon ||= 1
day ||= 1
hour ||= 0
min ||= 0
sec ||= 0
usec ||= 0
if year != off_year
off = nil
off = zone_offset(zone, year) if zone
end
if off
year, mon, day, hour, min, sec =
apply_offset(year, mon, day, hour, min, sec, off)
t = self.utc(year, mon, day, hour, min, sec, usec)
force_zone!(t, zone, off)
t
else
self.local(year, mon, day, hour, min, sec, usec)
end
end
month_days(y, m) Show source
# File lib/time.rb, line 198
def month_days(y, m)
if ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)
LeapYearMonthDays[m-1]
else
CommonYearMonthDays[m-1]
end
end
zone_utc?(zone) Show source
# File lib/time.rb, line 150
def zone_utc?(zone)
# * +0000
# In RFC 2822, +0000 indicate a time zone at Universal Time.
# Europe/Lisbon is "a time zone at Universal Time" in Winter.
# Atlantic/Reykjavik is "a time zone at Universal Time".
# Africa/Dakar is "a time zone at Universal Time".
# So +0000 is a local time such as Europe/London, etc.
# * GMT
# GMT is used as a time zone abbreviation in Europe/London,
# Africa/Dakar, etc.
# So it is a local time.
#
# * -0000, -00:00
# In RFC 2822, -0000 the date-time contains no information about the
# local time zone.
# In RFC 3339, -00:00 is used for the time in UTC is known,
# but the offset to local time is unknown.
# They are not appropriate for specific time zone such as
# Europe/London because time zone neutral,
# So -00:00 and -0000 are treated as UTC.
if /\A(?:-00:00|-0000|-00|UTC|Z|UT)\z/i =~ zone
true
else
false
end
end
公共实例方法
time + numeric → time Show source
加法 - 向时间
添加若干秒(可能为小数),并将该值作为新的时间
对象返回。
t = Time.now #=> 2007-11-19 08:22:21 -0600
t + (60 * 60 * 24) #=> 2007-11-20 08:22:21 -0600
static VALUE
time_plus(VALUE time1, VALUE time2)
{
struct time_object *tobj;
GetTimeval(time1, tobj
if (IsTimeval(time2)) {
rb_raise(rb_eTypeError, "time + time?"
}
return time_add(tobj, time2, 1
}
time - other_time → float Show source
time - numeric → time
差异 - 返回一个新的时间
对象,表示时间
和之间的差异other_time
,或者numeric
从时间中
减去给定的秒数。
t = Time.now #=> 2007-11-19 08:23:10 -0600
t2 = t + 2592000 #=> 2007-12-19 08:23:10 -0600
t2 - t #=> 2592000.0
t2 - 2592000 #=> 2007-11-19 08:23:10 -0600
static VALUE
time_minus(VALUE time1, VALUE time2)
{
struct time_object *tobj;
GetTimeval(time1, tobj
if (IsTimeval(time2)) {
struct time_object *tobj2;
GetTimeval(time2, tobj2
return rb_Float(rb_time_unmagnify_to_float(wsub(tobj->timew, tobj2->timew))
}
return time_add(tobj, time2, -1
}
time <=> other_time → -1, 0, +1 or nil Show source
比较 - time
与other_time
。
-1,0,+1或零,取决于time
是小于,等于还是大于other_time
。
如果两个值无法比较,则返回nil
。
t = Time.now #=> 2007-11-19 08:12:12 -0600
t2 = t + 2592000 #=> 2007-12-19 08:12:12 -0600
t <=> t2 #=> -1
t2 <=> t #=> 1
t = Time.now #=> 2007-11-19 08:13:38 -0600
t2 = t + 0.1 #=> 2007-11-19 08:13:38 -0600
t.nsec #=> 98222999
t2.nsec #=> 198222999
t <=> t2 #=> -1
t2 <=> t #=> 1
t <=> t #=> 0
static VALUE
time_cmp(VALUE time1, VALUE time2)
{
struct time_object *tobj1, *tobj2;
int n;
GetTimeval(time1, tobj1
if (IsTimeval(time2)) {
GetTimeval(time2, tobj2
n = wcmp(tobj1->timew, tobj2->timew
}
else {
return rb_invcmp(time1, time2
}
if (n == 0) return INT2FIX(0
if (n > 0) return INT2FIX(1
return INT2FIX(-1
}
as_json(*) Show source
返回一个散列,它将变成一个JSON对象并表示这个对象。
# File ext/json/lib/json/add/time.rb, line 22
def as_json(*)
nanoseconds = [ tv_usec * 1000 ]
respond_to?(:tv_nsec) and nanoseconds << tv_nsec
nanoseconds = nanoseconds.max
{
JSON.create_id => self.class.name,
's' => tv_sec,
'n' => nanoseconds,
}
end
asctime → string Show source
返回的规范的字符串表示的时间
。
Time.now.asctime #=> "Wed Apr 9 08:56:03 2003"
Time.now.ctime #=> "Wed Apr 9 08:56:03 2003"
static VALUE
time_asctime(VALUE time)
{
return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding()
}
ctime → string Show source
返回的规范的字符串表示的时间
。
Time.now.asctime #=> "Wed Apr 9 08:56:03 2003"
Time.now.ctime #=> "Wed Apr 9 08:56:03 2003"
static VALUE
time_asctime(VALUE time)
{
return strftimev("%a %b %e %T %Y", time, rb_usascii_encoding()
}
day → integer Show source
返回月份(1..N)的一天时间
。
t = Time.now #=> 2007-11-19 08:27:03 -0600
t.day #=> 19
t.mday #=> 19
static VALUE
time_mday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.mday
}
dst? → true or false Show source
返回true
如果时间
在其时区夏令时期间发生。
# CST6CDT:
Time.local(2000, 1, 1).zone #=> "CST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "CDT"
Time.local(2000, 7, 1).isdst #=> true
Time.local(2000, 7, 1).dst? #=> true
# Asia/Tokyo:
Time.local(2000, 1, 1).zone #=> "JST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "JST"
Time.local(2000, 7, 1).isdst #=> false
Time.local(2000, 7, 1).dst? #=> false
static VALUE
time_isdst(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return tobj->vtm.isdst ? Qtrue : Qfalse;
}
eql?(other_time) Show source
如果是时间
并且other_time
都是具有相同秒和小数秒的Time对象,则返回true
。
static VALUE
time_eql(VALUE time1, VALUE time2)
{
struct time_object *tobj1, *tobj2;
GetTimeval(time1, tobj1
if (IsTimeval(time2)) {
GetTimeval(time2, tobj2
return rb_equal(w2v(tobj1->timew), w2v(tobj2->timew)
}
return Qfalse;
}
friday? → true or false Show source
如果时间
代表星期五返回true
。
t = Time.local(1987, 12, 18) #=> 1987-12-18 00:00:00 -0600
t.friday? #=> true
static VALUE
time_friday(VALUE time)
{
wday_p(5
}
getgm → new_time Show source
返回表示新的时间
对象时间
在UTC。
t = Time.local(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 -0600
t.gmt? #=> false
y = t.getgm #=> 2000-01-02 02:15:01 UTC
y.gmt? #=> true
t == y #=> true
static VALUE
time_getgmtime(VALUE time)
{
return time_gmtime(time_dup(time)
}
getlocal → new_time Show source
getlocal(utc_offset) → new_time
返回表示新的时间
对象时间
在本地时间
(使用效果本地时区的这一过程)。
如果utc_offset
给出,它将被用来代替当地时间.utc_offset
可以作为人类可读的字符串(例如."+09:00"
)或以秒数(例如.32400
)的形式给出。
t = Time.utc(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.utc? #=> false
t == l #=> true
j = t.getlocal("+09:00") #=> 2000-01-02 05:15:01 +0900
j.utc? #=> false
t == j #=> true
k = t.getlocal(9*60*60) #=> 2000-01-02 05:15:01 +0900
k.utc? #=> false
t == k #=> true
static VALUE
time_getlocaltime(int argc, VALUE *argv, VALUE time)
{
VALUE off;
rb_scan_args(argc, argv, "01", &off
if (!NIL_P(off)) {
off = utc_offset_arg(off
validate_utc_offset(off
time = time_dup(time
time_set_utc_offset(time, off
return time_fixoff(time
}
return time_localtime(time_dup(time)
}
getutc → new_time Show source
返回表示新的时间
对象时间
在UTC。
t = Time.local(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 -0600
t.gmt? #=> false
y = t.getgm #=> 2000-01-02 02:15:01 UTC
y.gmt? #=> true
t == y #=> true
static VALUE
time_getgmtime(VALUE time)
{
return time_gmtime(time_dup(time)
}
gmt? → true or false Show source
如果时间
以UTC(GMT)表示时间
,则返回true
。
t = Time.now #=> 2007-11-19 08:15:23 -0600
t.utc? #=> false
t = Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t = Time.now #=> 2007-11-19 08:16:03 -0600
t.gmt? #=> false
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt? #=> true
static VALUE
time_utc_p(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
if (TIME_UTC_P(tobj)) return Qtrue;
return Qfalse;
}
gmt_offset → integer Show source
返回时间
和UTC 时间
之间的偏移量,以秒为单位。
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt_offset #=> 0
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.gmt_offset #=> -21600
static VALUE
time_utc_offset(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
if (TIME_UTC_P(tobj)) {
return INT2FIX(0
}
else {
return tobj->vtm.utc_offset;
}
}
gmtime → time Show source
将时间
转换为UTC(GMT),修改接收器。
t = Time.now #=> 2007-11-19 08:18:31 -0600
t.gmt? #=> false
t.gmtime #=> 2007-11-19 14:18:31 UTC
t.gmt? #=> true
t = Time.now #=> 2007-11-19 08:18:51 -0600
t.utc? #=> false
t.utc #=> 2007-11-19 14:18:51 UTC
t.utc? #=> true
static VALUE
time_gmtime(VALUE time)
{
struct time_object *tobj;
struct vtm vtm;
GetTimeval(time, tobj
if (TIME_UTC_P(tobj)) {
if (tobj->tm_got)
return time;
}
else {
time_modify(time
}
if (!gmtimew(tobj->timew, &vtm))
rb_raise(rb_eArgError, "gmtime error"
tobj->vtm = vtm;
tobj->tm_got = 1;
TIME_SET_UTC(tobj
return time;
}
gmtoff → integer Show source
返回时间
和UTC 时间
之间的偏移量,以秒为单位。
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt_offset #=> 0
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.gmt_offset #=> -21600
static VALUE
time_utc_offset(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
if (TIME_UTC_P(tobj)) {
return INT2FIX(0
}
else {
return tobj->vtm.utc_offset;
}
}
hash → integer Show source
返回此Time对象的哈希码。
另请参阅Object#hash。
static VALUE
time_hash(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
return rb_hash(w2v(tobj->timew)
}
hour → integer Show source
返回一天中的小时(0..23)时间
。
t = Time.now #=> 2007-11-19 08:26:20 -0600
t.hour #=> 8
static VALUE
time_hour(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.hour
}
httpdate() Show source
返回一个字符串,表示时间为由RFC 2616定义的HTTP-date的RFC 1123日期:
day-of-week, DD month-name CCYY hh:mm:ss GMT
请注意,结果始终是UTC(GMT)。
你必须要求'time'来使用这种方法。
# File lib/time.rb, line 653
def httpdate
t = dup.utc
sprintf('%s, %02d %s %0*d %02d:%02d:%02d GMT',
RFC2822_DAY_NAME[t.wday],
t.day, RFC2822_MONTH_NAME[t.mon-1], t.year < 0 ? 5 : 4, t.year,
t.hour, t.min, t.sec)
end
inspect → string Show source
返回表示时间
的字符串。相当于用适当的格式字符串调用strftime。
t = Time.now
t.to_s => "2012-11-10 18:16:12 +0100"
t.strftime "%Y-%m-%d %H:%M:%S %z" => "2012-11-10 18:16:12 +0100"
t.utc.to_s => "2012-11-10 17:16:12 UTC"
t.strftime "%Y-%m-%d %H:%M:%S UTC" => "2012-11-10 17:16:12 UTC"
static VALUE
time_to_s(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
if (TIME_UTC_P(tobj))
return strftimev("%Y-%m-%d %H:%M:%S UTC", time, rb_usascii_encoding()
else
return strftimev("%Y-%m-%d %H:%M:%S %z", time, rb_usascii_encoding()
}
isdst → true or false Show source
如果时间
在其时区夏令时期间发生,返回true
。
# CST6CDT:
Time.local(2000, 1, 1).zone #=> "CST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "CDT"
Time.local(2000, 7, 1).isdst #=> true
Time.local(2000, 7, 1).dst? #=> true
# Asia/Tokyo:
Time.local(2000, 1, 1).zone #=> "JST"
Time.local(2000, 1, 1).isdst #=> false
Time.local(2000, 1, 1).dst? #=> false
Time.local(2000, 7, 1).zone #=> "JST"
Time.local(2000, 7, 1).isdst #=> false
Time.local(2000, 7, 1).dst? #=> false
static VALUE
time_isdst(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return tobj->vtm.isdst ? Qtrue : Qfalse;
}
iso8601(fraction_digits=0)
别名为:xmlschema
localtime → time Show source
localtime(utc_offset) → time
将时间
转换为本地时间
(使用本过程的本地时区)修改接收器。
如果utc_offset
给出,它将被用来代替当地时间。
t = Time.utc(2000, "jan", 1, 20, 15, 1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t.localtime #=> 2000-01-01 14:15:01 -0600
t.utc? #=> false
t.localtime("+09:00") #=> 2000-01-02 05:15:01 +0900
t.utc? #=> false
static VALUE
time_localtime_m(int argc, VALUE *argv, VALUE time)
{
VALUE off;
rb_scan_args(argc, argv, "01", &off
if (!NIL_P(off)) {
off = utc_offset_arg(off
validate_utc_offset(off
time_set_utc_offset(time, off
return time_fixoff(time
}
return time_localtime(time
}
mday → integer Show source
返回月份(1..N)的一天时间
。
t = Time.now #=> 2007-11-19 08:27:03 -0600
t.day #=> 19
t.mday #=> 19
static VALUE
time_mday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.mday
}
min → integer Show source
返回小时(0..59)为的分钟时间
。
t = Time.now #=> 2007-11-19 08:25:51 -0600
t.min #=> 25
static VALUE
time_min(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.min
}
mon → integer Show source
month → integer
返回年份(1..12)的一个月时间
。
t = Time.now #=> 2007-11-19 08:27:30 -0600
t.mon #=> 11
t.month #=> 11
static VALUE
time_mon(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.mon
}
monday? → true or false Show source
如果时间
代表星期一返回true
。
t = Time.local(2003, 8, 4) #=> 2003-08-04 00:00:00 -0500
p t.monday? #=> true
static VALUE
time_monday(VALUE time)
{
wday_p(1
}
month → integer Show source
返回年份(1..12)的一个月时间
。
t = Time.now #=> 2007-11-19 08:27:30 -0600
t.mon #=> 11
t.month #=> 11
static VALUE
time_mon(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.mon
}
nsec → int Show source
返回时间
的纳秒数。
t = Time.now #=> 2007-11-17 15:18:03 +0900
"%10.9f" % t.to_f #=> "1195280283.536151409"
t.nsec #=> 536151406
to_f和nsec的最低位数不同,因为IEEE 754双精度不足以表示从Epoch开始的精确的纳秒数。
更精确的值由nsec返回。
static VALUE
time_nsec(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
return rb_to_int(w2v(wmulquoll(wmod(tobj->timew, WINT2WV(TIME_SCALE)), 1000000000, TIME_SCALE))
}
rfc2822() Show source
返回一个字符串,它将时间表示为由RFC 2822定义的日期时间:
day-of-week, DD month-name CCYY hh:mm:ss zone
其中区域是+ -hhmm。
如果self
是UTC时间,则将-0000用作区域。
你必须要求'time'来使用这种方法。
# File lib/time.rb, line 618
def rfc2822
sprintf('%s, %02d %s %0*d %02d:%02d:%02d ',
RFC2822_DAY_NAME[wday],
day, RFC2822_MONTH_NAME[mon-1], year < 0 ? 5 : 4, year,
hour, min, sec) <<
if utc?
'-0000'
else
off = utc_offset
sign = off < 0 ? '-' : '+'
sprintf('%s%02d%02d', sign, *(off.abs / 60).divmod(60))
end
end
另外别名为:rfc822
rfc822()
别名为:rfc2822
round(ndigits) → new_time Show source
以秒为单位将子秒数循环到一个给定的精度(默认为0位)。它返回一个新的Time对象。ndigits
应该是零或正整数。
require 'time'
t = Time.utc(2010,3,30, 5,43,"25.123456789".to_r)
p t.iso8601(10) #=> "2010-03-30T05:43:25.1234567890Z"
p t.round.iso8601(10) #=> "2010-03-30T05:43:25.0000000000Z"
p t.round(0).iso8601(10) #=> "2010-03-30T05:43:25.0000000000Z"
p t.round(1).iso8601(10) #=> "2010-03-30T05:43:25.1000000000Z"
p t.round(2).iso8601(10) #=> "2010-03-30T05:43:25.1200000000Z"
p t.round(3).iso8601(10) #=> "2010-03-30T05:43:25.1230000000Z"
p t.round(4).iso8601(10) #=> "2010-03-30T05:43:25.1235000000Z"
p t.round(5).iso8601(10) #=> "2010-03-30T05:43:25.1234600000Z"
p t.round(6).iso8601(10) #=> "2010-03-30T05:43:25.1234570000Z"
p t.round(7).iso8601(10) #=> "2010-03-30T05:43:25.1234568000Z"
p t.round(8).iso8601(10) #=> "2010-03-30T05:43:25.1234567900Z"
p t.round(9).iso8601(10) #=> "2010-03-30T05:43:25.1234567890Z"
p t.round(10).iso8601(10) #=> "2010-03-30T05:43:25.1234567890Z"
t = Time.utc(1999,12,31, 23,59,59)
p((t + 0.4).round.iso8601(3)) #=> "1999-12-31T23:59:59.000Z"
p((t + 0.49).round.iso8601(3)) #=> "1999-12-31T23:59:59.000Z"
p((t + 0.5).round.iso8601(3)) #=> "2000-01-01T00:00:00.000Z"
p((t + 1.4).round.iso8601(3)) #=> "2000-01-01T00:00:00.000Z"
p((t + 1.49).round.iso8601(3)) #=> "2000-01-01T00:00:00.000Z"
p((t + 1.5).round.iso8601(3)) #=> "2000-01-01T00:00:01.000Z"
t = Time.utc(1999,12,31, 23,59,59)
p (t + 0.123456789).round(4).iso8601(6) #=> "1999-12-31T23:59:59.123500Z"
static VALUE
time_round(int argc, VALUE *argv, VALUE time)
{
VALUE ndigits, v, a, b, den;
long nd;
struct time_object *tobj;
rb_scan_args(argc, argv, "01", &ndigits
if (NIL_P(ndigits))
ndigits = INT2FIX(0
else
ndigits = rb_to_int(ndigits
nd = NUM2LONG(ndigits
if (nd < 0)
rb_raise(rb_eArgError, "negative ndigits given"
GetTimeval(time, tobj
v = w2v(rb_time_unmagnify(tobj->timew)
a = INT2FIX(1
b = INT2FIX(10
while (0 < nd) {
if (nd & 1)
a = mul(a, b
b = mul(b, b
nd = nd >> 1;
}
den = quo(INT2FIX(1), a
v = mod(v, den
if (lt(v, quo(den, INT2FIX(2))))
return time_add(tobj, v, -1
else
return time_add(tobj, sub(den, v), 1
}
saturday? → true or false Show source
如果时间
代表星期六返回true
。
t = Time.local(2006, 6, 10) #=> 2006-06-10 00:00:00 -0500
t.saturday? #=> true
static VALUE
time_saturday(VALUE time)
{
wday_p(6
}
sec → integer Show source
返回分钟(0..60)为第二时间
。
注意:
秒的范围从0到60,以允许系统注入闰秒。有关更多详细信息,请参见en.wikipedia.org/wiki/Leap_second。
t = Time.now #=> 2007-11-19 08:25:02 -0600
t.sec #=> 2
static VALUE
time_sec(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.sec
}
strftime( string ) → string Show source
根据给定格式字符串中的指令格式化时间
。
指令以百分号(%)字符开头。任何未作为指令列出的文本都将传递到输出字符串。
该指令由百分号(%)字符,零个或多个标志,可选的最小字段宽度,可选的修饰符和转换说明符组成,如下所示:
%<flags><width><modifier><conversion>
Flags:
- don't pad a numerical output
_ use spaces for padding
0 use zeros for padding
^ upcase the result string
# change case
: use colons for %z
最小字段宽度指定最小宽度。
修饰符是“E”和“O”。他们被忽略。
格式指南:
Date (Year, Month, Day):
%Y - Year with century if provided, will pad result at least 4 digits.
-0001, 0000, 1995, 2009, 14292, etc.
%C - year / 100 (rounded down such as 20 in 2009)
%y - year % 100 (00..99)
%m - Month of the year, zero-padded (01..12)
%_m blank-padded ( 1..12)
%-m no-padded (1..12)
%B - The full month name (``January'')
%^B uppercased (``JANUARY'')
%b - The abbreviated month name (``Jan'')
%^b uppercased (``JAN'')
%h - Equivalent to %b
%d - Day of the month, zero-padded (01..31)
%-d no-padded (1..31)
%e - Day of the month, blank-padded ( 1..31)
%j - Day of the year (001..366)
Time (Hour, Minute, Second, Subsecond):
%H - Hour of the day, 24-hour clock, zero-padded (00..23)
%k - Hour of the day, 24-hour clock, blank-padded ( 0..23)
%I - Hour of the day, 12-hour clock, zero-padded (01..12)
%l - Hour of the day, 12-hour clock, blank-padded ( 1..12)
%P - Meridian indicator, lowercase (``am'' or ``pm'')
%p - Meridian indicator, uppercase (``AM'' or ``PM'')
%M - Minute of the hour (00..59)
%S - Second of the minute (00..60)
%L - Millisecond of the second (000..999)
The digits under millisecond are truncated to not produce 1000.
%N - Fractional seconds digits, default is 9 digits (nanosecond)
%3N millisecond (3 digits)
%6N microsecond (6 digits)
%9N nanosecond (9 digits)
%12N picosecond (12 digits)
%15N femtosecond (15 digits)
%18N attosecond (18 digits)
%21N zeptosecond (21 digits)
%24N yoctosecond (24 digits)
The digits under the specified length are truncated to avoid
carry up.
Time zone:
%z - Time zone as hour and minute offset from UTC (e.g. +0900)
%:z - hour and minute offset from UTC with a colon (e.g. +09:00)
%::z - hour, minute and second offset from UTC (e.g. +09:00:00)
%Z - Abbreviated time zone name or similar information. (OS dependent)
Weekday:
%A - The full weekday name (``Sunday'')
%^A uppercased (``SUNDAY'')
%a - The abbreviated name (``Sun'')
%^a uppercased (``SUN'')
%u - Day of the week (Monday is 1, 1..7)
%w - Day of the week (Sunday is 0, 0..6)
ISO 8601 week-based year and week number:
The first week of YYYY starts with a Monday and includes YYYY-01-04.
The days in the year before the first week are in the last week of
the previous year.
%G - The week-based year
%g - The last 2 digits of the week-based year (00..99)
%V - Week number of the week-based year (01..53)
Week number:
The first week of YYYY that starts with a Sunday or Monday (according to %U
or %W). The days in the year before the first week are in week 0.
%U - Week number of the year. The week starts with Sunday. (00..53)
%W - Week number of the year. The week starts with Monday. (00..53)
Seconds since the Epoch:
%s - Number of seconds since 1970-01-01 00:00:00 UTC.
Literal string:
%n - Newline character (\n)
%t - Tab character (\t)
%% - Literal ``%'' character
Combination:
%c - date and time (%a %b %e %T %Y)
%D - Date (%m/%d/%y)
%F - The ISO 8601 date format (%Y-%m-%d)
%v - VMS date (%e-%^b-%4Y)
%x - Same as %D
%X - Same as %T
%r - 12-hour time (%I:%M:%S %p)
%R - 24-hour time (%H:%M)
%T - 24-hour time (%H:%M:%S)
该方法与ISO C和POSIX中定义的strftime()函数类似。
尽管从Ruby 1.9开始,所有的指令都是独立于locale的,但%Z是依赖于平台的。因此,即使在其他系统(如C)中使用相同的格式字符串,结果也可能不同。
建议%Z比%Z更好。%Z不识别时区。例如,美国/芝加哥(-06:00),美国/哈瓦那(-05:00),亚洲/哈尔滨(+08:00),澳大利亚/达尔文(+09:30)和澳大利亚/阿德莱德(+10:30)。另外,%Z高度依赖于操作系统。例如,它可能会在日语Windows上生成非ASCII字符串。即结果可能与“JST”不同。所以建议使用数字时区偏移量%z。
例子:
t = Time.new(2007,11,19,8,37,48,"-06:00") #=> 2007-11-19 08:37:48 -0600
t.strftime("Printed on %m/%d/%Y") #=> "Printed on 11/19/2007"
t.strftime("at %I:%M%p") #=> "at 08:37AM"
各种ISO 8601格式:
%Y%m%d => 20071119 Calendar date (basic)
%F => 2007-11-19 Calendar date (extended)
%Y-%m => 2007-11 Calendar date, reduced accuracy, specific month
%Y => 2007 Calendar date, reduced accuracy, specific year
%C => 20 Calendar date, reduced accuracy, specific century
%Y%j => 2007323 Ordinal date (basic)
%Y-%j => 2007-323 Ordinal date (extended)
%GW%V%u => 2007W471 Week date (basic)
%G-W%V-%u => 2007-W47-1 Week date (extended)
%GW%V => 2007W47 Week date, reduced accuracy, specific week (basic)
%G-W%V => 2007-W47 Week date, reduced accuracy, specific week (extended)
%H%M%S => 083748 Local time (basic)
%T => 08:37:48 Local time (extended)
%H%M => 0837 Local time, reduced accuracy, specific minute (basic)
%H:%M => 08:37 Local time, reduced accuracy, specific minute (extended)
%H => 08 Local time, reduced accuracy, specific hour
%H%M%S,%L => 083748,000 Local time with decimal fraction, comma as decimal sign (basic)
%T,%L => 08:37:48,000 Local time with decimal fraction, comma as decimal sign (extended)
%H%M%S.%L => 083748.000 Local time with decimal fraction, full stop as decimal sign (basic)
%T.%L => 08:37:48.000 Local time with decimal fraction, full stop as decimal sign (extended)
%H%M%S%z => 083748-0600 Local time and the difference from UTC (basic)
%T%:z => 08:37:48-06:00 Local time and the difference from UTC (extended)
%Y%m%dT%H%M%S%z => 20071119T083748-0600 Date and time of day for calendar date (basic)
%FT%T%:z => 2007-11-19T08:37:48-06:00 Date and time of day for calendar date (extended)
%Y%jT%H%M%S%z => 2007323T083748-0600 Date and time of day for ordinal date (basic)
%Y-%jT%T%:z => 2007-323T08:37:48-06:00 Date and time of day for ordinal date (extended)
%GW%V%uT%H%M%S%z => 2007W471T083748-0600 Date and time of day for week date (basic)
%G-W%V-%uT%T%:z => 2007-W47-1T08:37:48-06:00 Date and time of day for week date (extended)
%Y%m%dT%H%M => 20071119T0837 Calendar date and local time (basic)
%FT%R => 2007-11-19T08:37 Calendar date and local time (extended)
%Y%jT%H%MZ => 2007323T0837Z Ordinal date and UTC of day (basic)
%Y-%jT%RZ => 2007-323T08:37Z Ordinal date and UTC of day (extended)
%GW%V%uT%H%M%z => 2007W471T0837-0600 Week date and local time and difference from UTC (basic)
%G-W%V-%uT%R%:z => 2007-W47-1T08:37-06:00 Week date and local time and difference from UTC (extended)
static VALUE
time_strftime(VALUE time, VALUE format)
{
struct time_object *tobj;
const char *fmt;
long len;
rb_encoding *enc;
GetTimeval(time, tobj
MAKE_TM(time, tobj
StringValue(format
if (!rb_enc_str_asciicompat_p(format)) {
rb_raise(rb_eArgError, "format should have ASCII compatible encoding"
}
format = rb_str_new4(format
fmt = RSTRING_PTR(format
len = RSTRING_LEN(format
enc = rb_enc_get(format
if (len == 0) {
rb_warning("strftime called with empty format string"
return rb_enc_str_new(0, 0, enc
}
else {
VALUE str = rb_strftime_alloc(fmt, len, enc, &tobj->vtm, tobj->timew,
TIME_UTC_P(tobj)
if (!str) rb_raise(rb_eArgError, "invalid format: %"PRIsVALUE, format
return str;
}
}
subsec → number Show source
返回时间
分数。
返回值可以是一个有理数。
t = Time.now #=> 2009-03-26 22:33:12 +0900
"%10.9f" % t.to_f #=> "1238074392.940563917"
t.subsec #=> (94056401/100000000)
to_f和subsec的最低位数是不同的,因为IEEE 754双精度不足以表示有理数。
subsec返回更准确的值。
static VALUE
time_subsec(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
return quo(w2v(wmod(tobj->timew, WINT2FIXWV(TIME_SCALE))), INT2FIX(TIME_SCALE)
}
succ → new_time Show source
返回一个新的Time对象,比时间
晚一秒。#succ自1.9.2开始已经过时,因为时间
不是离散值。
t = Time.now #=> 2007-11-19 08:23:57 -0600
t.succ #=> 2007-11-19 08:23:58 -0600
改为使用 time + 1
t + 1 #=> 2007-11-19 08:23:58 -0600
VALUE
rb_time_succ(VALUE time)
{
struct time_object *tobj;
struct time_object *tobj2;
rb_warn("Time#succ is obsolete; use time + 1"
GetTimeval(time, tobj
time = time_new_timew(rb_cTime, wadd(tobj->timew, WINT2FIXWV(TIME_SCALE))
GetTimeval(time, tobj2
TIME_COPY_GMT(tobj2, tobj
return time;
}
sunday? → true or false Show source
如果时间
表示星期日返回true
。
t = Time.local(1990, 4, 1) #=> 1990-04-01 00:00:00 -0600
t.sunday? #=> true
static VALUE
time_sunday(VALUE time)
{
wday_p(0
}
thursday? → true or false Show source
如果时间
代表星期四返回true
。
t = Time.local(1995, 12, 21) #=> 1995-12-21 00:00:00 -0600
p t.thursday? #=> true
static VALUE
time_thursday(VALUE time)
{
wday_p(4
}
to_a → array Show source
返回时间
值的十元素数组
:
[sec, min, hour, day, month, year, wday, yday, isdst, zone]
请参阅各个方法来解释每个值的有效范围。这十个元素可以直接传递给::utc或::local来创建一个新的Time对象。
t = Time.now #=> 2007-11-19 08:36:01 -0600
now = t.to_a #=> [1, 36, 8, 19, 11, 2007, 1, 323, false, "CST"]
static VALUE
time_to_a(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return rb_ary_new3(10,
INT2FIX(tobj->vtm.sec),
INT2FIX(tobj->vtm.min),
INT2FIX(tobj->vtm.hour),
INT2FIX(tobj->vtm.mday),
INT2FIX(tobj->vtm.mon),
tobj->vtm.year,
INT2FIX(tobj->vtm.wday),
INT2FIX(tobj->vtm.yday),
tobj->vtm.isdst?Qtrue:Qfalse,
time_zone(time)
}
to_date → date Show source
返回一个表示self的Date对象。
static VALUE
time_to_date(VALUE self)
{
VALUE y, nth, ret;
int ry, m, d;
y = f_year(self
m = FIX2INT(f_mon(self)
d = FIX2INT(f_mday(self)
decode_year(y, -1, &nth, &ry
ret = d_simple_new_internal(cDate,
nth, 0,
GREGORIAN,
ry, m, d,
HAVE_CIVIL
{
get_d1(ret
set_sg(dat, DEFAULT_SG
}
return ret;
}
to_datetime → datetime Show source
返回表示自我的DateTime对象。
static VALUE
time_to_datetime(VALUE self)
{
VALUE y, sf, nth, ret;
int ry, m, d, h, min, s, of;
y = f_year(self
m = FIX2INT(f_mon(self)
d = FIX2INT(f_mday(self)
h = FIX2INT(f_hour(self)
min = FIX2INT(f_min(self)
s = FIX2INT(f_sec(self)
if (s == 60)
s = 59;
sf = sec_to_ns(f_subsec(self)
of = FIX2INT(f_utc_offset(self)
decode_year(y, -1, &nth, &ry
ret = d_complex_new_internal(cDateTime,
nth, 0,
0, sf,
of, DEFAULT_SG,
ry, m, d,
h, min, s,
HAVE_CIVIL | HAVE_TIME
{
get_d1(ret
set_sg(dat, DEFAULT_SG
}
return ret;
}
to_f → float Show source
从Epoch开始,以秒为单位返回时间
值。
t = Time.now
"%10.5f" % t.to_f #=> "1270968744.77658"
t.to_i #=> 1270968744
请注意,IEEE 754双精度不足以表示自Epoch以来的纳秒数。
static VALUE
time_to_f(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
return rb_Float(rb_time_unmagnify_to_float(tobj->timew)
}
to_i → int Show source
从Epoch开始,以秒为单位返回时间
值。
t = Time.now
"%10.5f" % t.to_f #=> "1270968656.89607"
t.to_i #=> 1270968656
static VALUE
time_to_i(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE))
}
to_json(*args) Show source
存储类名称(时间),包含自epoch以来的秒数以及时间的微秒数作为JSON字符串
# File ext/json/lib/json/add/time.rb, line 35
def to_json(*args)
as_json.to_json(*args)
end
to_r → a_rational Show source
从Epoch开始,以秒为单位返回时间
值。
t = Time.now
p t.to_r #=> (1270968792716287611/1000000000)
此方法旨在用于获取表示自Epoch以来纳秒级的准确值。您可以使用此方法将时间
转换为另一个Epoch。
static VALUE
time_to_r(VALUE time)
{
struct time_object *tobj;
VALUE v;
GetTimeval(time, tobj
v = w2v(rb_time_unmagnify(tobj->timew)
if (!RB_TYPE_P(v, T_RATIONAL)) {
v = rb_Rational1(v
}
return v;
}
to_s → string Show source
返回表示时间
的字符串。相当于用适当的格式字符串调用strftime。
t = Time.now
t.to_s => "2012-11-10 18:16:12 +0100"
t.strftime "%Y-%m-%d %H:%M:%S %z" => "2012-11-10 18:16:12 +0100"
t.utc.to_s => "2012-11-10 17:16:12 UTC"
t.strftime "%Y-%m-%d %H:%M:%S UTC" => "2012-11-10 17:16:12 UTC"
static VALUE
time_to_s(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
if (TIME_UTC_P(tobj))
return strftimev("%Y-%m-%d %H:%M:%S UTC", time, rb_usascii_encoding()
else
return strftimev("%Y-%m-%d %H:%M:%S %z", time, rb_usascii_encoding()
}
to_time → time Show source
返回self。
static VALUE
time_to_time(VALUE self)
{
return self;
}
tuesday? → true or false Show source
如果时间
代表星期二返回true
。
t = Time.local(1991, 2, 19) #=> 1991-02-19 00:00:00 -0600
p t.tuesday? #=> true
static VALUE
time_tuesday(VALUE time)
{
wday_p(2
}
tv_nsec → int Show source
返回时间
的纳秒数。
t = Time.now #=> 2007-11-17 15:18:03 +0900
"%10.9f" % t.to_f #=> "1195280283.536151409"
t.nsec #=> 536151406
to_f和nsec的最低位数不同,因为IEEE 754双精度不足以表示从Epoch开始的精确的纳秒数。
更精确的值由nsec返回。
static VALUE
time_nsec(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
return rb_to_int(w2v(wmulquoll(wmod(tobj->timew, WINT2WV(TIME_SCALE)), 1000000000, TIME_SCALE))
}
tv_sec → int Show source
从Epoch开始,以秒为单位返回时间
值。
t = Time.now
"%10.5f" % t.to_f #=> "1270968656.89607"
t.to_i #=> 1270968656
static VALUE
time_to_i(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
return w2v(wdiv(tobj->timew, WINT2FIXWV(TIME_SCALE))
}
tv_usec → int Show source
返回时间
的微秒数。
t = Time.now #=> 2007-11-19 08:03:26 -0600
"%10.6f" % t.to_f #=> "1195481006.775195"
t.usec #=> 775195
static VALUE
time_usec(VALUE time)
{
struct time_object *tobj;
wideval_t w, q, r;
GetTimeval(time, tobj
w = wmod(tobj->timew, WINT2WV(TIME_SCALE)
wmuldivmod(w, WINT2FIXWV(1000000), WINT2FIXWV(TIME_SCALE), &q, &r
return rb_to_int(w2v(q)
}
usec → int Show source
返回时间
的微秒数。
t = Time.now #=> 2007-11-19 08:03:26 -0600
"%10.6f" % t.to_f #=> "1195481006.775195"
t.usec #=> 775195
static VALUE
time_usec(VALUE time)
{
struct time_object *tobj;
wideval_t w, q, r;
GetTimeval(time, tobj
w = wmod(tobj->timew, WINT2WV(TIME_SCALE)
wmuldivmod(w, WINT2FIXWV(1000000), WINT2FIXWV(TIME_SCALE), &q, &r
return rb_to_int(w2v(q)
}
gmtime → time Show source
utc → time
将时间
转换为UTC(GMT),修改接收器。
t = Time.now #=> 2007-11-19 08:18:31 -0600
t.gmt? #=> false
t.gmtime #=> 2007-11-19 14:18:31 UTC
t.gmt? #=> true
t = Time.now #=> 2007-11-19 08:18:51 -0600
t.utc? #=> false
t.utc #=> 2007-11-19 14:18:51 UTC
t.utc? #=> true
static VALUE
time_gmtime(VALUE time)
{
struct time_object *tobj;
struct vtm vtm;
GetTimeval(time, tobj
if (TIME_UTC_P(tobj)) {
if (tobj->tm_got)
return time;
}
else {
time_modify(time
}
if (!gmtimew(tobj->timew, &vtm))
rb_raise(rb_eArgError, "gmtime error"
tobj->vtm = vtm;
tobj->tm_got = 1;
TIME_SET_UTC(tobj
return time;
}
utc? → true or false Show source
如果时间
以UTC(GMT)表示时间
,则返回true
。
t = Time.now #=> 2007-11-19 08:15:23 -0600
t.utc? #=> false
t = Time.gm(2000,"jan",1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.utc? #=> true
t = Time.now #=> 2007-11-19 08:16:03 -0600
t.gmt? #=> false
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt? #=> true
static VALUE
time_utc_p(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
if (TIME_UTC_P(tobj)) return Qtrue;
return Qfalse;
}
utc_offset → integer Show source
返回时间
和UTC 时间
之间的偏移量,以秒为单位。
t = Time.gm(2000,1,1,20,15,1) #=> 2000-01-01 20:15:01 UTC
t.gmt_offset #=> 0
l = t.getlocal #=> 2000-01-01 14:15:01 -0600
l.gmt_offset #=> -21600
static VALUE
time_utc_offset(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
if (TIME_UTC_P(tobj)) {
return INT2FIX(0
}
else {
return tobj->vtm.utc_offset;
}
}
w3cdtf() Show source
此方法将Time对象转换为String。该字符串包含W3CDTF date/time格式的时间。
W3CDTF格式在此定义:www.w3.org/TR/NOTE-datetime
Time.now.w3cdtf
# => "2013-08-26T14:12:10.817124-07:00"
# File lib/rss/rss.rb, line 52
def w3cdtf
if usec.zero?
fraction_digits = 0
else
fraction_digits = strftime('%6N').index(/0*\z/)
end
xmlschema(fraction_digits)
end
wday → integer Show source
返回一个整数,表示星期几,0..6,星期天== 0。
t = Time.now #=> 2007-11-20 02:35:35 -0600
t.wday #=> 2
t.sunday? #=> false
t.monday? #=> false
t.tuesday? #=> true
t.wednesday? #=> false
t.thursday? #=> false
t.friday? #=> false
t.saturday? #=> false
static VALUE
time_wday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX((int)tobj->vtm.wday
}
wednesday? → true or false Show source
如果时间
代表星期三返回true
。
t = Time.local(1993, 2, 24) #=> 1993-02-24 00:00:00 -0600
p t.wednesday? #=> true
static VALUE
time_wednesday(VALUE time)
{
wday_p(3
}
xmlschema(fraction_digits=0) Show source
返回一个字符串,它将时间表示为由XML Schema定义的dateTime:
CCYY-MM-DDThh:mm:ssTZD
CCYY-MM-DDThh:mm:ss.sssTZD
TZD是Z或+ -hh:mm。
如果self是UTC时间,则Z用作TZD。否则使用+ -hh:mm。
fractional_digits
指定用于小数秒的多个数字。它的默认值是0。
你必须要求'time'来使用这种方法。
# File lib/time.rb, line 677
def xmlschema(fraction_digits=0)
fraction_digits = fraction_digits.to_i
s = strftime("%FT%T")
if fraction_digits > 0
s << strftime(".%#{fraction_digits}N")
end
s << (utc? ? 'Z' : strftime("%:z"))
end
另外别名为:iso8601
yday → integer Show source
返回一个表示一年中的一天的整数,1..366。
t = Time.now #=> 2007-11-19 08:32:31 -0600
t.yday #=> 323
static VALUE
time_yday(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return INT2FIX(tobj->vtm.yday
}
year → integer Show source
返回时间
的年份(包括世纪)。
t = Time.now #=> 2007-11-19 08:27:51 -0600
t.year #=> 2007
static VALUE
time_year(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
return tobj->vtm.year;
}
zone → string Show source
返回用于时间
的时区的名称。从Ruby 1.8开始,UTC时间
返回“UTC”而不是“GMT”。
t = Time.gm(2000, "jan", 1, 20, 15, 1)
t.zone #=> "UTC"
t = Time.local(2000, "jan", 1, 20, 15, 1)
t.zone #=> "CST"
static VALUE
time_zone(VALUE time)
{
struct time_object *tobj;
GetTimeval(time, tobj
MAKE_TM(time, tobj
if (TIME_UTC_P(tobj)) {
return rb_usascii_str_new_cstr("UTC"
}
if (tobj->vtm.zone == NULL)
return Qnil;
return time_zone_name(tobj->vtm.zone
}