1 package org.apache.lucene.document;
3 import java.text.ParseException;
4 import java.text.SimpleDateFormat;
5 import java.util.Calendar;
7 import java.util.GregorianCalendar;
8 import java.util.TimeZone;
9 import java.util.Locale;
11 import org.apache.lucene.util.LuceneTestCase;
14 * Licensed to the Apache Software Foundation (ASF) under one or more
15 * contributor license agreements. See the NOTICE file distributed with
16 * this work for additional information regarding copyright ownership.
17 * The ASF licenses this file to You under the Apache License, Version 2.0
18 * (the "License"); you may not use this file except in compliance with
19 * the License. You may obtain a copy of the License at
21 * http://www.apache.org/licenses/LICENSE-2.0
23 * Unless required by applicable law or agreed to in writing, software
24 * distributed under the License is distributed on an "AS IS" BASIS,
25 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
26 * See the License for the specific language governing permissions and
27 * limitations under the License.
29 public class TestDateTools extends LuceneTestCase {
31 public void testStringToDate() throws ParseException {
34 d = DateTools.stringToDate("2004");
35 assertEquals("2004-01-01 00:00:00:000", isoFormat(d));
36 d = DateTools.stringToDate("20040705");
37 assertEquals("2004-07-05 00:00:00:000", isoFormat(d));
38 d = DateTools.stringToDate("200407050910");
39 assertEquals("2004-07-05 09:10:00:000", isoFormat(d));
40 d = DateTools.stringToDate("20040705091055990");
41 assertEquals("2004-07-05 09:10:55:990", isoFormat(d));
44 d = DateTools.stringToDate("97"); // no date
46 } catch(ParseException e) { /* expected exception */ }
48 d = DateTools.stringToDate("200401011235009999"); // no date
50 } catch(ParseException e) { /* expected exception */ }
52 d = DateTools.stringToDate("aaaa"); // no date
54 } catch(ParseException e) { /* expected exception */ }
58 public void testStringtoTime() throws ParseException {
59 long time = DateTools.stringToTime("197001010000");
60 Calendar cal = new GregorianCalendar();
62 cal.set(1970, 0, 1, // year=1970, month=january, day=1
63 0, 0, 0); // hour, minute, second
64 cal.set(Calendar.MILLISECOND, 0);
65 cal.setTimeZone(TimeZone.getTimeZone("GMT"));
66 assertEquals(cal.getTime().getTime(), time);
67 cal.set(1980, 1, 2, // year=1980, month=february, day=2
68 11, 5, 0); // hour, minute, second
69 cal.set(Calendar.MILLISECOND, 0);
70 time = DateTools.stringToTime("198002021105");
71 assertEquals(cal.getTime().getTime(), time);
74 public void testDateAndTimetoString() throws ParseException {
75 Calendar cal = new GregorianCalendar();
77 cal.setTimeZone(TimeZone.getTimeZone("GMT"));
78 cal.set(2004, 1, 3, // year=2004, month=february(!), day=3
79 22, 8, 56); // hour, minute, second
80 cal.set(Calendar.MILLISECOND, 333);
83 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.YEAR);
84 assertEquals("2004", dateString);
85 assertEquals("2004-01-01 00:00:00:000", isoFormat(DateTools.stringToDate(dateString)));
87 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.MONTH);
88 assertEquals("200402", dateString);
89 assertEquals("2004-02-01 00:00:00:000", isoFormat(DateTools.stringToDate(dateString)));
91 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.DAY);
92 assertEquals("20040203", dateString);
93 assertEquals("2004-02-03 00:00:00:000", isoFormat(DateTools.stringToDate(dateString)));
95 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.HOUR);
96 assertEquals("2004020322", dateString);
97 assertEquals("2004-02-03 22:00:00:000", isoFormat(DateTools.stringToDate(dateString)));
99 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.MINUTE);
100 assertEquals("200402032208", dateString);
101 assertEquals("2004-02-03 22:08:00:000", isoFormat(DateTools.stringToDate(dateString)));
103 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.SECOND);
104 assertEquals("20040203220856", dateString);
105 assertEquals("2004-02-03 22:08:56:000", isoFormat(DateTools.stringToDate(dateString)));
107 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.MILLISECOND);
108 assertEquals("20040203220856333", dateString);
109 assertEquals("2004-02-03 22:08:56:333", isoFormat(DateTools.stringToDate(dateString)));
112 cal.set(1961, 2, 5, // year=1961, month=march(!), day=5
113 23, 9, 51); // hour, minute, second
114 cal.set(Calendar.MILLISECOND, 444);
115 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.MILLISECOND);
116 assertEquals("19610305230951444", dateString);
117 assertEquals("1961-03-05 23:09:51:444", isoFormat(DateTools.stringToDate(dateString)));
119 dateString = DateTools.dateToString(cal.getTime(), DateTools.Resolution.HOUR);
120 assertEquals("1961030523", dateString);
121 assertEquals("1961-03-05 23:00:00:000", isoFormat(DateTools.stringToDate(dateString)));
124 cal.set(1970, 0, 1, // year=1970, month=january, day=1
125 0, 0, 0); // hour, minute, second
126 cal.set(Calendar.MILLISECOND, 0);
127 dateString = DateTools.timeToString(cal.getTime().getTime(),
128 DateTools.Resolution.MILLISECOND);
129 assertEquals("19700101000000000", dateString);
131 cal.set(1970, 0, 1, // year=1970, month=january, day=1
132 1, 2, 3); // hour, minute, second
133 cal.set(Calendar.MILLISECOND, 0);
134 dateString = DateTools.timeToString(cal.getTime().getTime(),
135 DateTools.Resolution.MILLISECOND);
136 assertEquals("19700101010203000", dateString);
139 public void testRound() {
140 Calendar cal = new GregorianCalendar();
142 cal.setTimeZone(TimeZone.getTimeZone("GMT"));
143 cal.set(2004, 1, 3, // year=2004, month=february(!), day=3
144 22, 8, 56); // hour, minute, second
145 cal.set(Calendar.MILLISECOND, 333);
146 Date date = cal.getTime();
147 assertEquals("2004-02-03 22:08:56:333", isoFormat(date));
149 Date dateYear = DateTools.round(date, DateTools.Resolution.YEAR);
150 assertEquals("2004-01-01 00:00:00:000", isoFormat(dateYear));
152 Date dateMonth = DateTools.round(date, DateTools.Resolution.MONTH);
153 assertEquals("2004-02-01 00:00:00:000", isoFormat(dateMonth));
155 Date dateDay = DateTools.round(date, DateTools.Resolution.DAY);
156 assertEquals("2004-02-03 00:00:00:000", isoFormat(dateDay));
158 Date dateHour = DateTools.round(date, DateTools.Resolution.HOUR);
159 assertEquals("2004-02-03 22:00:00:000", isoFormat(dateHour));
161 Date dateMinute = DateTools.round(date, DateTools.Resolution.MINUTE);
162 assertEquals("2004-02-03 22:08:00:000", isoFormat(dateMinute));
164 Date dateSecond = DateTools.round(date, DateTools.Resolution.SECOND);
165 assertEquals("2004-02-03 22:08:56:000", isoFormat(dateSecond));
167 Date dateMillisecond = DateTools.round(date, DateTools.Resolution.MILLISECOND);
168 assertEquals("2004-02-03 22:08:56:333", isoFormat(dateMillisecond));
171 long dateYearLong = DateTools.round(date.getTime(), DateTools.Resolution.YEAR);
172 assertEquals("2004-01-01 00:00:00:000", isoFormat(new Date(dateYearLong)));
174 long dateMillisecondLong = DateTools.round(date.getTime(), DateTools.Resolution.MILLISECOND);
175 assertEquals("2004-02-03 22:08:56:333", isoFormat(new Date(dateMillisecondLong)));
178 private String isoFormat(Date date) {
179 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.US);
180 sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
181 return sdf.format(date);
184 public void testDateToolsUTC() throws Exception {
185 // Sun, 30 Oct 2005 00:00:00 +0000 -- the last second of 2005's DST in Europe/London
186 long time = 1130630400;
188 TimeZone.setDefault(TimeZone.getTimeZone(/* "GMT" */ "Europe/London"));
189 String d1 = DateTools.dateToString(new Date(time*1000), DateTools.Resolution.MINUTE);
190 String d2 = DateTools.dateToString(new Date((time+3600)*1000), DateTools.Resolution.MINUTE);
191 assertFalse("different times", d1.equals(d2));
192 assertEquals("midnight", DateTools.stringToTime(d1), time*1000);
193 assertEquals("later", DateTools.stringToTime(d2), (time+3600)*1000);
195 TimeZone.setDefault(null);