third_base 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +19 -0
- data/README +261 -0
- data/benchmark/date.rb +18 -0
- data/benchmark/datetime.rb +18 -0
- data/bin/third_base +4 -0
- data/lib/third_base/compat/date/format.rb +3 -0
- data/lib/third_base/compat/date.rb +3 -0
- data/lib/third_base/compat.rb +405 -0
- data/lib/third_base/date.rb +674 -0
- data/lib/third_base/datetime.rb +385 -0
- data/lib/third_base.rb +2 -0
- data/spec/compat/compat_class_methods_spec.rb +208 -0
- data/spec/compat/compat_instance_methods_spec.rb +54 -0
- data/spec/compat/date_spec.rb +56 -0
- data/spec/compat/datetime_spec.rb +77 -0
- data/spec/compat_spec_helper.rb +2 -0
- data/spec/date/accessor_spec.rb +134 -0
- data/spec/date/add_month_spec.rb +28 -0
- data/spec/date/add_spec.rb +24 -0
- data/spec/date/boat_spec.rb +31 -0
- data/spec/date/civil_spec.rb +47 -0
- data/spec/date/commercial_spec.rb +34 -0
- data/spec/date/constants_spec.rb +18 -0
- data/spec/date/downto_spec.rb +17 -0
- data/spec/date/eql_spec.rb +9 -0
- data/spec/date/hash_spec.rb +13 -0
- data/spec/date/julian_spec.rb +13 -0
- data/spec/date/leap_spec.rb +19 -0
- data/spec/date/minus_month_spec.rb +26 -0
- data/spec/date/minus_spec.rb +47 -0
- data/spec/date/ordinal_spec.rb +13 -0
- data/spec/date/parse_spec.rb +227 -0
- data/spec/date/step_spec.rb +55 -0
- data/spec/date/strftime_spec.rb +132 -0
- data/spec/date/strptime_spec.rb +118 -0
- data/spec/date/succ_spec.rb +16 -0
- data/spec/date/today_spec.rb +11 -0
- data/spec/date/upto_spec.rb +17 -0
- data/spec/date_spec_helper.rb +3 -0
- data/spec/datetime/accessor_spec.rb +53 -0
- data/spec/datetime/add_spec.rb +36 -0
- data/spec/datetime/boat_spec.rb +43 -0
- data/spec/datetime/constructor_spec.rb +58 -0
- data/spec/datetime/eql_spec.rb +11 -0
- data/spec/datetime/minus_spec.rb +65 -0
- data/spec/datetime/now_spec.rb +14 -0
- data/spec/datetime/parse_spec.rb +338 -0
- data/spec/datetime/strftime_spec.rb +102 -0
- data/spec/datetime/strptime_spec.rb +84 -0
- data/spec/datetime_spec_helper.rb +3 -0
- data/spec/spec_helper.rb +54 -0
- metadata +107 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTime#<=>" do
|
4
|
+
|
5
|
+
it "should be able to compare two same DateTimes" do
|
6
|
+
(DateTime.civil(2000, 04, 06) <=> DateTime.civil(2000, 04, 06)).should == 0
|
7
|
+
(DateTime.civil(2000, 04, 06, 10, 12, 11) <=> DateTime.civil(2000, 04, 06, 10, 12, 11)).should == 0
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be able to compute the difference between two DateTimes" do
|
11
|
+
(DateTime.civil(2000, 04, 05) <=> DateTime.civil(2000, 04, 06)).should == -1
|
12
|
+
(DateTime.civil(2001, 04, 05) <=> DateTime.civil(2000, 04, 06)).should == 1
|
13
|
+
(DateTime.civil(2000, 04, 05, 10, 12, 13, 1) <=> DateTime.civil(2000, 04, 05, 10, 12, 13, 2)).should == -1
|
14
|
+
(DateTime.civil(2001, 04, 05, 10, 12, 13, 1) <=> DateTime.civil(2001, 04, 05, 10, 12, 13, 0)).should == 1
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to compare to another numeric" do
|
18
|
+
(DateTime.civil(2000, 04, 05) <=> DateTime.civil(2000, 04, 06).jd).should == -1
|
19
|
+
(DateTime.civil(2001, 04, 05) <=> DateTime.civil(2000, 04, 06).jd).should == 1
|
20
|
+
|
21
|
+
(DateTime.civil(2000, 04, 05).jd <=> 2451640).should == 0
|
22
|
+
(DateTime.civil(2000, 04, 05) <=> 2451640.00000001).should == -1
|
23
|
+
(DateTime.civil(2000, 04, 05) <=> 2451639.99999999).should == 1
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "DateTime#between?" do
|
29
|
+
it "should be true if the DateTime falls in between the two given DateTimes" do
|
30
|
+
(DateTime.civil(2000, 04, 06).between?(DateTime.civil(2000, 04, 05), DateTime.civil(2000, 04, 07))).should == true
|
31
|
+
(DateTime.civil(2000, 04, 06).between?(DateTime.civil(2000, 04, 06), DateTime.civil(2000, 04, 07))).should == true
|
32
|
+
(DateTime.civil(2000, 04, 06).between?(DateTime.civil(2000, 04, 05), DateTime.civil(2000, 04, 06))).should == true
|
33
|
+
|
34
|
+
(DateTime.civil(2000, 04, 06, 10, 12, 11, 13).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 12), DateTime.civil(2000, 04, 06, 10, 12, 11, 14))).should == true
|
35
|
+
(DateTime.civil(2000, 04, 06, 10, 12, 11, 12).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 12), DateTime.civil(2000, 04, 06, 10, 12, 11, 14))).should == true
|
36
|
+
(DateTime.civil(2000, 04, 06, 10, 12, 11, 14).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 12), DateTime.civil(2000, 04, 06, 10, 12, 11, 14))).should == true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be false if the DateTime does not fall in between the two given DateTimes" do
|
40
|
+
(DateTime.civil(2000, 04, 05).between?(DateTime.civil(2000, 04, 06), DateTime.civil(2000, 04, 07))).should == false
|
41
|
+
(DateTime.civil(2000, 04, 06, 10, 12, 11, 14).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 15), DateTime.civil(2000, 04, 06, 10, 12, 11, 16))).should == false
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTime constructors" do
|
4
|
+
it ".civil creates a datetime with arguments" do
|
5
|
+
d = DateTime.civil(2000, 3, 5, 6, 7, 8, 9, 10)
|
6
|
+
d.year.should == 2000
|
7
|
+
d.month.should == 3
|
8
|
+
d.day.should == 5
|
9
|
+
d.hour.should == 6
|
10
|
+
d.min.should == 7
|
11
|
+
d.sec.should == 8
|
12
|
+
d.usec.should == 9
|
13
|
+
d.offset.should == 10
|
14
|
+
end
|
15
|
+
|
16
|
+
it ".commercial creates a datetime with arguments" do
|
17
|
+
d = DateTime.commercial(2000, 3, 5, 6, 7, 8, 9, 10)
|
18
|
+
d.cwyear.should == 2000
|
19
|
+
d.cweek.should == 3
|
20
|
+
d.cwday.should == 5
|
21
|
+
d.hour.should == 6
|
22
|
+
d.min.should == 7
|
23
|
+
d.sec.should == 8
|
24
|
+
d.usec.should == 9
|
25
|
+
d.offset.should == 10
|
26
|
+
end
|
27
|
+
|
28
|
+
it ".jd creates a datetime with arguments" do
|
29
|
+
d = DateTime.jd(2000, 6, 7, 8, 9, 10)
|
30
|
+
d.jd.should == 2000
|
31
|
+
d.hour.should == 6
|
32
|
+
d.min.should == 7
|
33
|
+
d.sec.should == 8
|
34
|
+
d.usec.should == 9
|
35
|
+
d.offset.should == 10
|
36
|
+
end
|
37
|
+
|
38
|
+
it ".jd_fract creates a datetime with arguments" do
|
39
|
+
d = DateTime.jd_fract(2000, 0.5, 10)
|
40
|
+
d.jd.should == 2000
|
41
|
+
d.hour.should == 12
|
42
|
+
d.min.should == 0
|
43
|
+
d.sec.should == 0
|
44
|
+
d.usec.should == 0
|
45
|
+
d.offset.should == 10
|
46
|
+
end
|
47
|
+
|
48
|
+
it ".ordinal creates a datetime with arguments" do
|
49
|
+
d = DateTime.ordinal(2000, 100, 6, 7, 8, 9, 10)
|
50
|
+
d.year.should == 2000
|
51
|
+
d.yday.should == 100
|
52
|
+
d.hour.should == 6
|
53
|
+
d.min.should == 7
|
54
|
+
d.sec.should == 8
|
55
|
+
d.usec.should == 9
|
56
|
+
d.offset.should == 10
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTime#eql?" do
|
4
|
+
it "should be able determine equality between date objects" do
|
5
|
+
DateTime.civil(2007, 10, 11).should eql(DateTime.civil(2007, 10, 11))
|
6
|
+
DateTime.civil(2007, 10, 11, 10, 11, 12, 13).should eql(DateTime.civil(2007, 10, 11, 10, 11, 12, 13))
|
7
|
+
DateTime.civil(2007, 10, 11, 10, 11, 12, 13).usec.should eql((DateTime.civil(2007, 10, 12, 10, 11, 12, 13) - 1).usec)
|
8
|
+
DateTime.civil(2007, 10, 11, 10, 11, 12, 13).should eql(DateTime.civil(2007, 10, 12, 10, 11, 12, 13) - 1)
|
9
|
+
DateTime.civil(2007, 10, 11, 10, 11, 12, 13).should_not eql(DateTime.civil(2007, 10, 11, 10, 11, 12, 12))
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTimeTime#-" do
|
4
|
+
|
5
|
+
it "should substract a number of days from a DateTime" do
|
6
|
+
(DateTime.civil(2008, 1, 8) - 315).should == DateTime.civil(2007,2,27)
|
7
|
+
(DateTime.commercial(2007, 47, 2) - 315).should == DateTime.commercial(2007,2,2)
|
8
|
+
(DateTime.jd(2455097) - 315).should == DateTime.jd(2454782)
|
9
|
+
(DateTime.ordinal(2008, 325) - 315).should == DateTime.ordinal(2008, 10)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should subtract a fractional number of days to a Date" do
|
13
|
+
(DateTime.civil(2008, 1, 8, 12) - 315.5).should == DateTime.civil(2007,2,27)
|
14
|
+
(DateTime.commercial(2007, 47, 2, 18) - 315.75).should == DateTime.commercial(2007,2,2)
|
15
|
+
(DateTime.jd(2455097, 6) - 315.25).should == DateTime.jd(2454782)
|
16
|
+
(DateTime.ordinal(2008, 325, 6) - 315.25).should == DateTime.ordinal(2008, 10)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should substract a negative number of days from a DateTime" do
|
20
|
+
d = DateTime.civil(2007, 4, 19).-(-13)
|
21
|
+
d.should == DateTime.civil(2007, 5 ,2)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should subtract a fractional negative number of days to a Date" do
|
25
|
+
d = DateTime.civil(2007, 2, 16, 12).-(-10.5)
|
26
|
+
d.should == DateTime.civil(2007,2,27)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be able to compute the different between two DateTimes" do
|
30
|
+
(DateTime.civil(2007,2,27) - DateTime.civil(2007,2,27)).should be_close(0.0, 0.00000001)
|
31
|
+
(DateTime.civil(2007,2,27) - DateTime.civil(2007,2,26)).should be_close(1.0, 0.00000001)
|
32
|
+
(DateTime.civil(2006,2,27) - DateTime.civil(2007,2,27)).should be_close(-365.0, 0.00000001)
|
33
|
+
(DateTime.civil(2008,2,27) - DateTime.civil(2007,2,27)).should be_close(365.0, 0.00000001)
|
34
|
+
(DateTime.civil(2009,2,27) - DateTime.civil(2008,2,27)).should be_close(366.0, 0.00000001)
|
35
|
+
|
36
|
+
(DateTime.civil(2009,2,27) - DateTime.commercial(2008,2,1)).should be_close(417.0, 0.00000001)
|
37
|
+
(DateTime.civil(2009,2,27) - DateTime.jd(2454782)).should be_close(108.0, 0.00000001)
|
38
|
+
(DateTime.civil(2009,2,27) - DateTime.ordinal(2008, 10)).should be_close(414.0, 0.00000001)
|
39
|
+
|
40
|
+
(DateTime.commercial(2008,2,1) - DateTime.civil(2008,2,27)).should be_close(-51.0, 0.00000001)
|
41
|
+
(DateTime.commercial(2008,2,1) - DateTime.jd(2454782)).should be_close(-309.0, 0.00000001)
|
42
|
+
(DateTime.commercial(2008,2,1) - DateTime.ordinal(2008, 10)).should be_close(-3.0, 0.00000001)
|
43
|
+
|
44
|
+
(DateTime.jd(2454782) - DateTime.commercial(2008,2,1)).should be_close(309.0, 0.00000001)
|
45
|
+
(DateTime.jd(2454782) - DateTime.civil(2009,2,27)).should be_close(-108.0, 0.00000001)
|
46
|
+
(DateTime.jd(2454782) - DateTime.ordinal(2008, 10)).should be_close(306.0, 0.00000001)
|
47
|
+
|
48
|
+
(DateTime.ordinal(2008, 10) - DateTime.commercial(2008,2,1)).should be_close(3.0, 0.00000001)
|
49
|
+
(DateTime.ordinal(2008, 10) - DateTime.jd(2454782)).should be_close(-306.0, 0.00000001)
|
50
|
+
(DateTime.ordinal(2008, 10) - DateTime.civil(2009,2,27)).should be_close(-414.0, 0.00000001)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should consider the offset when computing the different between two DateTimes" do
|
54
|
+
(DateTime.civil(2007,2,27, 0, 0, 0, 0, 43200) - DateTime.civil(2007,2,27,0,0,0,0)).should be_close(0.5, 0.00000001)
|
55
|
+
(DateTime.civil(2007,2,27, 0, 0, 0, 0, 43200) - DateTime.civil(2007,2,27,12,0,0,0)).should be_close(0.0, 0.00000001)
|
56
|
+
(DateTime.civil(2007,2,27,0,0,0,0,-43200) - DateTime.civil(2007,2,27,0,0,0,0,43200)).should be_close(-1.0, 0.00000001)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should raise an error on non numeric parameters" do
|
60
|
+
lambda { DateTime.civil(2007,2,27) - :hello }.should raise_error(TypeError)
|
61
|
+
lambda { DateTime.civil(2007,2,27) - "hello" }.should raise_error(TypeError)
|
62
|
+
lambda { DateTime.civil(2007,2,27) - Object.new }.should raise_error(TypeError)
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTime.now" do
|
4
|
+
it "should be right now as a DateTime" do
|
5
|
+
t = Time.now
|
6
|
+
d = DateTime.now
|
7
|
+
d.year.should == t.year
|
8
|
+
d.mon.should == t.mon
|
9
|
+
d.day.should == t.day
|
10
|
+
d.hour.should == t.hour
|
11
|
+
d.min.should == t.min
|
12
|
+
d.sec.should == t.sec
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,338 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTime#parse" do
|
4
|
+
it "can't handle a empty string" do
|
5
|
+
lambda{ DateTime.parse("") }.should raise_error(ArgumentError)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Specs using numbers
|
9
|
+
it "can't handle a single digit" do
|
10
|
+
lambda{ DateTime.parse("1") }.should raise_error(ArgumentError)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "can handle many different types of time values" do
|
14
|
+
DateTime.parse("01:02:03").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3)
|
15
|
+
DateTime.parse("01:02:03a").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3)
|
16
|
+
DateTime.parse(" 1:02:03a").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3)
|
17
|
+
DateTime.parse("1:02:03a").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3)
|
18
|
+
DateTime.parse("01:02:03am").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3)
|
19
|
+
DateTime.parse("01:02:03p").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 13, 2, 3)
|
20
|
+
DateTime.parse("01:02:03pm").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 13, 2, 3)
|
21
|
+
DateTime.parse("12:02:03am").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 0, 2, 3)
|
22
|
+
DateTime.parse("12:02:03p").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 12, 2, 3)
|
23
|
+
proc{DateTime.parse("13:02:03p")}.should raise_error(ArgumentError)
|
24
|
+
proc{DateTime.parse("00:02:03p")}.should raise_error(ArgumentError)
|
25
|
+
proc{DateTime.parse("00:02:03r")}.should raise_error(ArgumentError)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should use the current time offset if no time offset is specified" do
|
29
|
+
DateTime.parse("01:02:03").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3, 0, Time.now.utc_offset)
|
30
|
+
DateTime.parse("01:02:03Z").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3, 0, 0)
|
31
|
+
DateTime.parse("01:02:03+0100").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3, 0, 3600)
|
32
|
+
DateTime.parse("01:02:03-01:00").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3, 0, -3600)
|
33
|
+
DateTime.parse("01:02:03+01").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3, 0, 3600)
|
34
|
+
DateTime.parse("01:02:03-01").should == DateTime.civil(DateTime.today.year, DateTime.today.month, DateTime.today.day, 1, 2, 3, 0, -3600)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "can handle DD as month day number" do
|
38
|
+
DateTime.parse("10").should == DateTime.civil(DateTime.today.year, DateTime.today.month, 10)
|
39
|
+
DateTime.parse("10 01:02:03").should == DateTime.civil(DateTime.today.year, DateTime.today.month, 10, 1, 2, 3)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "can handle DDD as year day number" do
|
43
|
+
DateTime.parse("050").should == DateTime.civil(DateTime.today.year, 2, 19)
|
44
|
+
DateTime.parse("050 1:02:03").should == DateTime.civil(DateTime.today.year, 2, 19, 1, 2, 3)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "can handle MMDD as month and day" do
|
48
|
+
DateTime.parse("1108").should == DateTime.civil(DateTime.today.year, 11, 8)
|
49
|
+
DateTime.parse("1108 10:02:03").should == DateTime.civil(DateTime.today.year, 11, 8, 10, 2, 3)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "can handle YYDDD as year and day number" do
|
53
|
+
DateTime.parse("10100").should == DateTime.civil(2010, 4, 10)
|
54
|
+
DateTime.parse("10100 23:02:03").should == DateTime.civil(2010, 4, 10, 23, 2, 3)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "can handle YYMMDD as year month and day" do
|
58
|
+
DateTime.parse("201023").should == DateTime.civil(2020, 10, 23)
|
59
|
+
DateTime.parse("201023 23:02:03 +0800").should == DateTime.civil(2020, 10, 23, 23, 2, 3, 0, 28800)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can handle YYYYDDD as year and day number" do
|
63
|
+
DateTime.parse("1910100").should == DateTime.civil(1910, 4, 10)
|
64
|
+
DateTime.parse("1910100 23:02:03 -0101").should == DateTime.civil(1910, 4, 10, 23, 2, 3, 0, -3660)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "can handle YYYYMMDD as year and day number" do
|
68
|
+
DateTime.parse("19101101").should == DateTime.civil(1910, 11, 1)
|
69
|
+
DateTime.parse("19101101T23:02:03 +0000").should == DateTime.civil(1910, 11, 1, 23, 2, 3)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe :date_parse, :shared => true do
|
74
|
+
it "can parse a mmm-YYYY string into a DateTime object" do
|
75
|
+
d = DateTime.parse("feb#{@sep}2008")
|
76
|
+
d.year.should == 2008
|
77
|
+
d.month.should == 2
|
78
|
+
d.day.should == 1
|
79
|
+
|
80
|
+
d = DateTime.parse("feb#{@sep}2008 1:02:03")
|
81
|
+
d.year.should == 2008
|
82
|
+
d.month.should == 2
|
83
|
+
d.day.should == 1
|
84
|
+
d.hour.should == 1
|
85
|
+
d.min.should == 2
|
86
|
+
d.sec.should == 3
|
87
|
+
end
|
88
|
+
|
89
|
+
it "can parse a 'DD mmm YYYY' string into a DateTime object" do
|
90
|
+
d = DateTime.parse("23#{@sep}feb#{@sep}2008")
|
91
|
+
d.year.should == 2008
|
92
|
+
d.month.should == 2
|
93
|
+
d.day.should == 23
|
94
|
+
|
95
|
+
d = DateTime.parse("23#{@sep}feb#{@sep}2008 11:02:03")
|
96
|
+
d.year.should == 2008
|
97
|
+
d.month.should == 2
|
98
|
+
d.day.should == 23
|
99
|
+
d.hour.should == 11
|
100
|
+
d.min.should == 2
|
101
|
+
d.sec.should == 3
|
102
|
+
end
|
103
|
+
|
104
|
+
it "can parse a 'mmm DD YYYY' string into a DateTime object" do
|
105
|
+
d = DateTime.parse("feb#{@sep}23#{@sep}2008")
|
106
|
+
d.year.should == 2008
|
107
|
+
d.month.should == 2
|
108
|
+
d.day.should == 23
|
109
|
+
|
110
|
+
d = DateTime.parse("feb#{@sep}23#{@sep}2008 01:02:03")
|
111
|
+
d.year.should == 2008
|
112
|
+
d.month.should == 2
|
113
|
+
d.day.should == 23
|
114
|
+
d.hour.should == 1
|
115
|
+
d.min.should == 2
|
116
|
+
d.sec.should == 3
|
117
|
+
end
|
118
|
+
|
119
|
+
it "can parse a 'YYYY mmm DD' string into a DateTime object" do
|
120
|
+
d = DateTime.parse("2008#{@sep}feb#{@sep}23")
|
121
|
+
d.year.should == 2008
|
122
|
+
d.month.should == 2
|
123
|
+
d.day.should == 23
|
124
|
+
|
125
|
+
d = DateTime.parse("2008#{@sep}feb#{@sep}23 01:02")
|
126
|
+
d.year.should == 2008
|
127
|
+
d.month.should == 2
|
128
|
+
d.day.should == 23
|
129
|
+
d.hour.should == 1
|
130
|
+
d.min.should == 2
|
131
|
+
d.sec.should == 0
|
132
|
+
end
|
133
|
+
|
134
|
+
it "can parse a month name and day into a Date object" do
|
135
|
+
DateTime.parse("november#{@sep}5th").should == DateTime.civil(Date.today.year, 11, 5)
|
136
|
+
DateTime.parse("november#{@sep}5th 1:02").should == DateTime.civil(Date.today.year, 11, 5, 1, 2)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "can parse a month name, day and year into a Date object" do
|
140
|
+
DateTime.parse("november#{@sep}5th#{@sep}2005").should == DateTime.civil(2005, 11, 5)
|
141
|
+
DateTime.parse("november#{@sep}5th#{@sep}2005 1:02").should == DateTime.civil(2005, 11, 5, 1, 2)
|
142
|
+
end
|
143
|
+
|
144
|
+
it "can parse a year, month name and day into a Date object" do
|
145
|
+
DateTime.parse("2005#{@sep}november#{@sep}5th").should == DateTime.civil(2005, 11, 5)
|
146
|
+
DateTime.parse("2005#{@sep}november#{@sep}5th 01:02 +0100").should == DateTime.civil(2005, 11, 5, 1, 2, 0, 0, 3600)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "can parse a year, day and month name into a Date object" do
|
150
|
+
DateTime.parse("5th#{@sep}november#{@sep}2005").should == DateTime.civil(2005, 11, 5)
|
151
|
+
DateTime.parse("5th#{@sep}november#{@sep}2005 1:02 -0100").should == DateTime.civil(2005, 11, 5, 1, 2, 0, 0, -3600)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "can handle negative year numbers" do
|
155
|
+
DateTime.parse("5th#{@sep}november#{@sep}-2005").should == DateTime.civil(-2005, 11, 5)
|
156
|
+
DateTime.parse("5th#{@sep}november#{@sep}-2005 1:02 -0100").should == DateTime.civil(-2005, 11, 5, 1, 2, 0, 0, -3600)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe :date_parse_us, :shared => true do
|
161
|
+
it "parses a YYYY#{@sep}MM#{@sep}DD string into a DateTime object" do
|
162
|
+
d = DateTime.parse("2007#{@sep}10#{@sep}01")
|
163
|
+
d.year.should == 2007
|
164
|
+
d.month.should == 10
|
165
|
+
d.day.should == 1
|
166
|
+
|
167
|
+
d = DateTime.parse("2007#{@sep}10#{@sep}01 01:02:03")
|
168
|
+
d.year.should == 2007
|
169
|
+
d.month.should == 10
|
170
|
+
d.day.should == 1
|
171
|
+
d.hour.should == 1
|
172
|
+
d.min.should == 2
|
173
|
+
d.sec.should == 3
|
174
|
+
end
|
175
|
+
|
176
|
+
it "parses a MM#{@sep}DD#{@sep}YYYY string into a DateTime object" do
|
177
|
+
d = DateTime.parse("10#{@sep}01#{@sep}2007")
|
178
|
+
d.year.should == 2007
|
179
|
+
d.month.should == 10
|
180
|
+
d.day.should == 1
|
181
|
+
|
182
|
+
|
183
|
+
d = DateTime.parse("10#{@sep}01#{@sep}2007 01:02:03")
|
184
|
+
d.year.should == 2007
|
185
|
+
d.month.should == 10
|
186
|
+
d.day.should == 1
|
187
|
+
d.hour.should == 1
|
188
|
+
d.min.should == 2
|
189
|
+
d.sec.should == 3
|
190
|
+
end
|
191
|
+
|
192
|
+
it "parses a MM#{@sep}DD#{@sep}YY string into a DateTime object using the year digits as 20XX" do
|
193
|
+
d = DateTime.parse("10#{@sep}01#{@sep}07")
|
194
|
+
d.year.should == 2007
|
195
|
+
d.month.should == 10
|
196
|
+
d.day.should == 1
|
197
|
+
|
198
|
+
d = DateTime.parse("10#{@sep}01#{@sep}97 01:02:03 Z")
|
199
|
+
d.year.should == 1997
|
200
|
+
d.month.should == 10
|
201
|
+
d.day.should == 1
|
202
|
+
d.hour.should == 1
|
203
|
+
d.min.should == 2
|
204
|
+
d.sec.should == 3
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
describe :date_parse_eu, :shared => true do
|
209
|
+
before do
|
210
|
+
DateTime.use_parsers(:iso, :eu)
|
211
|
+
end
|
212
|
+
after do
|
213
|
+
DateTime.reset_parsers!
|
214
|
+
end
|
215
|
+
|
216
|
+
# The - separator let's it work like European format, so it as a different spec
|
217
|
+
it "can parse a YYYY-MM-DD string into a DateTime object" do
|
218
|
+
d = DateTime.parse("2007#{@sep}10#{@sep}01")
|
219
|
+
d.year.should == 2007
|
220
|
+
d.month.should == 10
|
221
|
+
d.day.should == 1
|
222
|
+
|
223
|
+
d = DateTime.parse("2007#{@sep}10#{@sep}01 01:02:03Z")
|
224
|
+
d.year.should == 2007
|
225
|
+
d.month.should == 10
|
226
|
+
d.day.should == 1
|
227
|
+
d.hour.should == 1
|
228
|
+
d.min.should == 2
|
229
|
+
d.sec.should == 3
|
230
|
+
end
|
231
|
+
|
232
|
+
it "can parse a DD-MM-YYYY string into a DateTime object" do
|
233
|
+
d = DateTime.parse("10#{@sep}01#{@sep}2007")
|
234
|
+
d.year.should == 2007
|
235
|
+
d.month.should == 1
|
236
|
+
d.day.should == 10
|
237
|
+
|
238
|
+
d = DateTime.parse("10#{@sep}01#{@sep}2007 01:02:03-01:00")
|
239
|
+
d.year.should == 2007
|
240
|
+
d.month.should == 1
|
241
|
+
d.day.should == 10
|
242
|
+
d.hour.should == 1
|
243
|
+
d.min.should == 2
|
244
|
+
d.sec.should == 3
|
245
|
+
d.offset.should == -3600
|
246
|
+
end
|
247
|
+
|
248
|
+
it "can parse a YY-MM-DD string into a DateTime object" do
|
249
|
+
d = DateTime.parse("10#{@sep}01#{@sep}07")
|
250
|
+
d.year.should == 2010
|
251
|
+
d.month.should == 1
|
252
|
+
d.day.should == 7
|
253
|
+
|
254
|
+
d = DateTime.parse("97#{@sep}01#{@sep}07 01:02:03+01:00")
|
255
|
+
d.year.should == 1997
|
256
|
+
d.month.should == 1
|
257
|
+
d.day.should == 7
|
258
|
+
d.hour.should == 1
|
259
|
+
d.min.should == 2
|
260
|
+
d.sec.should == 3
|
261
|
+
d.offset.should == 3600
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
|
266
|
+
describe "DateTime#parse with '.' separator" do
|
267
|
+
before :all do
|
268
|
+
@sep = '.'
|
269
|
+
end
|
270
|
+
|
271
|
+
it_should_behave_like "date_parse"
|
272
|
+
end
|
273
|
+
|
274
|
+
describe "DateTime#parse with '/' separator" do
|
275
|
+
before :all do
|
276
|
+
@sep = '/'
|
277
|
+
end
|
278
|
+
|
279
|
+
it_should_behave_like "date_parse"
|
280
|
+
end
|
281
|
+
|
282
|
+
describe "DateTime#parse with ' ' separator" do
|
283
|
+
before :all do
|
284
|
+
@sep = ' '
|
285
|
+
end
|
286
|
+
|
287
|
+
it_should_behave_like "date_parse"
|
288
|
+
end
|
289
|
+
|
290
|
+
describe "DateTime#parse with '/' separator US-style" do
|
291
|
+
before :all do
|
292
|
+
@sep = '/'
|
293
|
+
end
|
294
|
+
|
295
|
+
it_should_behave_like "date_parse_us"
|
296
|
+
end
|
297
|
+
|
298
|
+
ruby_version_is "" ... "1.8.7" do
|
299
|
+
describe "DateTime#parse with '.' separator US-style" do
|
300
|
+
before :all do
|
301
|
+
@sep = '.'
|
302
|
+
end
|
303
|
+
|
304
|
+
it_should_behave_like "date_parse_us"
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
describe "DateTime#parse with '-' separator EU-style" do
|
309
|
+
before :all do
|
310
|
+
@sep = '-'
|
311
|
+
end
|
312
|
+
|
313
|
+
it_should_behave_like "date_parse_eu"
|
314
|
+
end
|
315
|
+
|
316
|
+
describe "DateTime parser modifications" do
|
317
|
+
after do
|
318
|
+
DateTime.reset_parsers!
|
319
|
+
end
|
320
|
+
|
321
|
+
it "should be able to add a parser to an existing parser type that takes precedence" do
|
322
|
+
d = DateTime.now
|
323
|
+
proc{DateTime.parse("today")}.should raise_error(ArgumentError)
|
324
|
+
DateTime.add_parser(:iso, /\Anow\z/){{:civil=>[d.year, d.mon, d.day], :parts=>[d.hour, d.min, d.sec, d.usec], :offset=>d.offset}}
|
325
|
+
DateTime.parse("now").should == d
|
326
|
+
end
|
327
|
+
|
328
|
+
it "should be able to add new parser types" do
|
329
|
+
proc{DateTime.parse("today")}.should raise_error(ArgumentError)
|
330
|
+
DateTime.add_parser_type(:mine)
|
331
|
+
d = DateTime.now
|
332
|
+
DateTime.add_parser(:mine, /\Anow\z/){{:civil=>[d.year, d.mon, d.day], :parts=>[d.hour, d.min, d.sec, d.usec], :offset=>d.offset}}
|
333
|
+
proc{DateTime.parse("now")}.should raise_error(ArgumentError)
|
334
|
+
DateTime.parse("now", :parser_types=>[:mine]).should == d
|
335
|
+
DateTime.use_parsers(:mine)
|
336
|
+
DateTime.parse("now").should == d
|
337
|
+
end
|
338
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTime#strftime" do
|
4
|
+
|
5
|
+
it "should be able to print the date time" do
|
6
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime.should == "2000-04-06T10:11:12+00:00"
|
7
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime.should == DateTime.civil(2000, 4, 6, 10, 11, 12).to_s
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be able to print the hour in a 24 hour clock with leading zero" do
|
11
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%H').should == "10"
|
12
|
+
DateTime.civil(2000, 4, 6, 13, 11, 12).strftime('%H').should == "13"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be able to print the hour in a 12 hour clock with leading zero" do
|
16
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%I').should == "10"
|
17
|
+
DateTime.civil(2000, 4, 6, 13, 11, 12).strftime('%I').should == "01"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be able to print the hour in a 24 hour clock with leading space" do
|
21
|
+
DateTime.civil(2000, 4, 6, 9, 11, 12).strftime('%k').should == " 9"
|
22
|
+
DateTime.civil(2000, 4, 6, 13, 11, 12).strftime('%k').should == "13"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to print the hour in a 12 hour clock with leading space" do
|
26
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%l').should == "10"
|
27
|
+
DateTime.civil(2000, 4, 6, 13, 11, 12).strftime('%l').should == " 1"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be able to print the minute with leading zero" do
|
31
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%M').should == "11"
|
32
|
+
DateTime.civil(2000, 4, 6, 10, 14, 12).strftime('%M').should == "14"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to print the meridian indicator in lower case" do
|
36
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%P').should == "am"
|
37
|
+
DateTime.civil(2000, 4, 6, 13, 11, 12).strftime('%P').should == "pm"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to print the meridian indicator in upper case" do
|
41
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%p').should == "AM"
|
42
|
+
DateTime.civil(2000, 4, 6, 13, 11, 12).strftime('%p').should == "PM"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be able to print the second with leading zero" do
|
46
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%S').should == "12"
|
47
|
+
DateTime.civil(2000, 4, 6, 10, 11, 13).strftime('%S').should == "13"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should be able to print the number of seconds since the unix epoch" do
|
51
|
+
DateTime.civil(2008, 11, 12, 14, 3, 30, 0, -28800).strftime('%s').should == "1226527410"
|
52
|
+
DateTime.civil(2008, 11, 12, 14, 3, 31, 0, -28800).strftime('%s').should == "1226527411"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should be able to print the time zone offset as a Z if the offset is zero" do
|
56
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%Z').should == "Z"
|
57
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12, 0, -43200).strftime('%Z').should == "-12:00"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should be able to print the time zone offset as a string of hours and minutes" do
|
61
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%z').should == "+00:00"
|
62
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12, 0, -43200).strftime('%z').should == "-12:00"
|
63
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12, 0, 43200).strftime('%z').should == "+12:00"
|
64
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12, 0, -3600).strftime('%z').should == "-01:00"
|
65
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12, 0, 3600).strftime('%z').should == "+01:00"
|
66
|
+
end
|
67
|
+
|
68
|
+
############################
|
69
|
+
# Specs that combine stuff #
|
70
|
+
############################
|
71
|
+
|
72
|
+
it "should be able to print the common date" do
|
73
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime("%c").should == "Thu Apr 6 10:11:12 2000"
|
74
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime("%c").should == DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%a %b %e %H:%M:%S %Y')
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should be able to print the hour and minute" do
|
78
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime("%R").should == "10:11"
|
79
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime("%R").should == DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%H:%M')
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should be able to show the hour, minute, second, and am/pm flag" do
|
83
|
+
DateTime.civil(2000, 4, 9, 10, 11, 12).strftime("%r").should == "10:11:12 AM"
|
84
|
+
DateTime.civil(2000, 4, 9, 13, 11, 12).strftime("%r").should == "01:11:12 PM"
|
85
|
+
DateTime.civil(2000, 4, 9, 10, 11, 12).strftime("%r").should == DateTime.civil(2000, 4, 9, 10, 11, 12).strftime('%I:%M:%S %p')
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should be able to show the hour, minute, and second" do
|
89
|
+
DateTime.civil(2000, 4, 9, 10, 11, 12).strftime("%T").should == "10:11:12"
|
90
|
+
DateTime.civil(2000, 4, 9, 13, 11, 12).strftime("%T").should == "13:11:12"
|
91
|
+
DateTime.civil(2000, 4, 9, 10, 11, 12).strftime("%T").should == DateTime.civil(2000, 4, 9, 10, 11, 12).strftime('%H:%M:%S')
|
92
|
+
DateTime.civil(2000, 4, 9, 10, 11, 12).strftime("%X").should == "10:11:12"
|
93
|
+
DateTime.civil(2000, 4, 9, 13, 11, 12).strftime("%X").should == "13:11:12"
|
94
|
+
DateTime.civil(2000, 4, 9, 10, 11, 12).strftime("%X").should == DateTime.civil(2000, 4, 9, 10, 11, 12).strftime('%H:%M:%S')
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should be able to print the common date and timezone" do
|
98
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime("%+").should == "Thu Apr 6 10:11:12 +00:00 2000"
|
99
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12, 0, 43200).strftime("%+").should == "Thu Apr 6 10:11:12 +12:00 2000"
|
100
|
+
DateTime.civil(2000, 4, 6, 10, 11, 12).strftime("%+").should == DateTime.civil(2000, 4, 6, 10, 11, 12).strftime('%a %b %e %H:%M:%S %z %Y')
|
101
|
+
end
|
102
|
+
end
|