Index: ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateAdd.java =================================================================== --- ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateAdd.java (revision 0) +++ ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateAdd.java (revision 0) @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.udf; + +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.Text; + +import junit.framework.TestCase; + +import java.util.TimeZone; + +/** + * JUnit test for UDFDateAdd. + */ +public class TestUDFDateAdd extends TestCase { + + /** + * Verify if adding dates across a daylight savings time change + * from daylight to standard time. The timezone tested is west + * coast US (PDT/PST) with a 1 hour shift back in time at 02:00 AM + * on 2009-10-31. + */ + public void testFallBack() throws Exception { + // set the default time zone so that the dates cover + // the zone's daylight saving time adjustment (2009-10-31) + // from daylight to standard time + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + final IntWritable nmDays = new IntWritable(7); + final Text dtStr = new Text("2009-10-26"); + + final Text result = new UDFDateAdd().evaluate(dtStr, nmDays); + assertEquals("2009-11-02", result.toString()); + } + + /** + * Verify if adding dates across a daylight savings time change + * from standard to daylight time. The timezone tested is west + * coast US (PDT/PST) with a 1 hour shift forward in time at 02:00 AM + * on 2010-03-14. + */ + public void testSpringAhead() throws Exception { + // set the default time zone so that the dates cover + // the zone's daylight saving time adjustment (2010-03-14) + // from standard to daylight time + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + final IntWritable nmDays = new IntWritable(7); + final Text dtStr = new Text("2010-03-08"); + + final Text result = new UDFDateAdd().evaluate(dtStr, nmDays); + assertEquals("2010-03-15", result.toString()); + } +} Index: ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateDiff.java =================================================================== --- ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateDiff.java (revision 0) +++ ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateDiff.java (revision 0) @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.udf; + +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.Text; + +import junit.framework.TestCase; + +import java.util.TimeZone; + +/** + * JUnit test for UDFDateDiff. + */ +public class TestUDFDateDiff extends TestCase { + + /** + * Verify differences of dates crossing a daylight savings time change + * are correct. The timezone tested is west coast US (PDT/PST) with a + * 1 hour shift back in time at 02:00 AM on 2009-10-31 and a + * 1 hour shift forward in time at 02:00 AM on 2010-03-14. + */ + public void testDaylightChange() throws Exception { + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + + // time moves ahead an hour at 02:00 on 2009-10-31 + // which results in a 23 hour long day + Text date1 = new Text("2009-11-01"); + Text date2 = new Text("2009-10-25"); + + IntWritable result = new UDFDateDiff().evaluate(date1, date2); + assertEquals(7, result.get()); + + result = new UDFDateDiff().evaluate(date2, date1); + assertEquals(-7, result.get()); + + + // time moves back an hour at 02:00 on 2010-03-14 + // which results in a 25 hour long day + date1 = new Text("2010-03-15"); + date2 = new Text("2010-03-08"); + + result = new UDFDateDiff().evaluate(date1, date2); + assertEquals(7, result.get()); + + result = new UDFDateDiff().evaluate(date2, date1); + assertEquals(-7, result.get()); + + } +} Index: ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateSub.java =================================================================== --- ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateSub.java (revision 0) +++ ql/src/test/org/apache/hadoop/hive/ql/udf/TestUDFDateSub.java (revision 0) @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.udf; + +import org.apache.hadoop.io.IntWritable; +import org.apache.hadoop.io.Text; + +import junit.framework.TestCase; + +import java.util.TimeZone; + +/** + * JUnit test for UDFDateSub. + */ +public class TestUDFDateSub extends TestCase { + + /** + * Verify if subtracting dates across a daylight savings time change + * from daylight to standard time. The timezone tested is west + * coast US (PDT/PST) with a 1 hour shift back in time at 02:00 AM + * on 2009-10-31. + */ + public void testFallBack() throws Exception { + // set the default time zone so that the dates cover + // the zone's daylight saving time adjustment (2009-10-31) + // from daylight to standard time + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + final IntWritable nmDays = new IntWritable(7); + final Text dtStr = new Text("2009-11-02"); + + final Text result = new UDFDateSub().evaluate(dtStr, nmDays); + assertEquals("2009-10-26", result.toString()); + } + + /** + * Verify if subtracting dates across a daylight savings time change + * from standard to daylight time. The timezone tested is west + * coast US (PDT/PST) with a 1 hour shift forward in time at 02:00 AM + * on 2010-03-14. + */ + public void testSpringAhead() throws Exception { + // set the default time zone so that the dates cover + // the zone's daylight saving time adjustment (2010-03-14) + // from standard to daylight time + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + final IntWritable nmDays = new IntWritable(7); + final Text dtStr = new Text("2010-03-15"); + + final Text result = new UDFDateSub().evaluate(dtStr, nmDays); + assertEquals("2010-03-08", result.toString()); + } +} Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDateSub.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDateSub.java (revision 925492) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDateSub.java (working copy) @@ -22,7 +22,6 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import java.util.TimeZone; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; @@ -43,8 +42,7 @@ + " '2009-29-07'") public class UDFDateSub extends UDF { private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - private final Calendar calendar = Calendar.getInstance(TimeZone - .getTimeZone("UTC")); + private final Calendar calendar = Calendar.getInstance(); private Text result = new Text(); Index: ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDateAdd.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDateAdd.java (revision 925492) +++ ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDateAdd.java (working copy) @@ -22,7 +22,6 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import java.util.TimeZone; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; @@ -43,7 +42,7 @@ + " '2009-31-07'") public class UDFDateAdd extends UDF { private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - private final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + private final Calendar calendar = Calendar.getInstance(); private Text result = new Text();