blob: 8df917e6fca203a65f1169e3f15be81fe4333a51 [file] [log] [blame]
/*
* 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.iotdb.db.utils;
import org.apache.iotdb.tsfile.utils.TimeDuration;
import org.junit.Assert;
import org.junit.Test;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import static org.junit.Assert.assertEquals;
public class DateTimeUtilsTest {
private ZoneOffset zoneOffset;
private ZoneId zoneId;
// 1546413207689
// 2019-01-02T15:13:27.689+08:00
private final long timestamp = 1546413207689L;
private long delta;
/** Test convertDatetimeStrToLong() method with different time precision. */
@Test
public void convertDatetimeStrToLongTest1() {
zoneOffset = ZonedDateTime.now().getOffset();
zoneId = ZoneId.systemDefault();
if (zoneOffset.toString().equals("Z")) {
delta = 8 * 3600000;
} else {
delta = (8 - Long.parseLong(zoneOffset.toString().split(":")[0])) * 3600000;
}
testConvertDatetimeStrToLongWithoutMS(zoneOffset, zoneId, timestamp - 689 + delta);
testConvertDatetimeStrToLongWithMS(zoneOffset, zoneId, timestamp + delta);
testConvertDatetimeStrToLongWithMS2(zoneOffset, zoneId, timestamp - 9 + delta);
}
@Test
public void convertDatetimeStrToLongTest2() {
zoneOffset = ZoneOffset.UTC;
zoneId = ZoneId.of("Etc/UTC");
delta = 8 * 3600000;
testConvertDatetimeStrToLongWithoutMS(zoneOffset, zoneId, timestamp - 689 + delta);
testConvertDatetimeStrToLongWithMS(zoneOffset, zoneId, timestamp + delta);
testConvertDatetimeStrToLongWithMS2(zoneOffset, zoneId, timestamp - 9 + delta);
}
@Test
public void convertDatetimeStrToLongTest3() {
zoneOffset = ZoneOffset.UTC;
zoneId = ZoneId.of("Etc/UTC");
delta = 8 * 3600000;
// 2019-01-02T00:00:00.000+08:00
long timestamp1 = 1546358400000L;
testConvertDateStrToLong(zoneOffset, zoneId, timestamp1 + delta);
}
/** Test time precision is ms. */
@Test
public void convertDurationStrToLongTest1() {
Assert.assertEquals(7000L, DateTimeUtils.convertDurationStrToLongForTest(7, "s", "ms"));
Assert.assertEquals(420000L, DateTimeUtils.convertDurationStrToLongForTest(7, "m", "ms"));
Assert.assertEquals(25200000L, DateTimeUtils.convertDurationStrToLongForTest(7, "h", "ms"));
Assert.assertEquals(604800000L, DateTimeUtils.convertDurationStrToLongForTest(7, "d", "ms"));
Assert.assertEquals(4233600000L, DateTimeUtils.convertDurationStrToLongForTest(7, "w", "ms"));
Assert.assertEquals(18144000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "mo", "ms"));
Assert.assertEquals(220752000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "y", "ms"));
Assert.assertEquals(7L, DateTimeUtils.convertDurationStrToLongForTest(7, "ms", "ms"));
Assert.assertEquals(7L, DateTimeUtils.convertDurationStrToLongForTest(7000, "us", "ms"));
Assert.assertEquals(7L, DateTimeUtils.convertDurationStrToLongForTest(7000000, "ns", "ms"));
}
/** Test time precision is us. */
@Test
public void convertDurationStrToLongTest2() {
Assert.assertEquals(7000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "s", "us"));
Assert.assertEquals(420000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "m", "us"));
Assert.assertEquals(25200000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "h", "us"));
Assert.assertEquals(604800000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "d", "us"));
Assert.assertEquals(
4233600000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "w", "us"));
Assert.assertEquals(
18144000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "mo", "us"));
Assert.assertEquals(
220752000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "y", "us"));
Assert.assertEquals(7000L, DateTimeUtils.convertDurationStrToLongForTest(7, "ms", "us"));
Assert.assertEquals(7L, DateTimeUtils.convertDurationStrToLongForTest(7, "us", "us"));
Assert.assertEquals(7L, DateTimeUtils.convertDurationStrToLongForTest(7000, "ns", "us"));
}
/** Test time precision is ns. */
@Test
public void convertDurationStrToLongTest3() {
Assert.assertEquals(7000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "s", "ns"));
Assert.assertEquals(420000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "m", "ns"));
Assert.assertEquals(
25200000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "h", "ns"));
Assert.assertEquals(
604800000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "d", "ns"));
Assert.assertEquals(
4233600000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "w", "ns"));
Assert.assertEquals(
18144000000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "mo", "ns"));
Assert.assertEquals(
220752000000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "y", "ns"));
Assert.assertEquals(7000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "ms", "ns"));
Assert.assertEquals(7000L, DateTimeUtils.convertDurationStrToLongForTest(7, "us", "ns"));
Assert.assertEquals(7L, DateTimeUtils.convertDurationStrToLongForTest(7, "ns", "ns"));
}
@Test
public void getInstantWithPrecisionTest() {
Assert.assertEquals(7000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "s", "ns"));
Assert.assertEquals(420000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "m", "ns"));
Assert.assertEquals(
25200000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "h", "ns"));
Assert.assertEquals(
604800000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "d", "ns"));
Assert.assertEquals(
4233600000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "w", "ns"));
Assert.assertEquals(
18144000000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "mo", "ns"));
Assert.assertEquals(
220752000000000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "y", "ns"));
Assert.assertEquals(7000000L, DateTimeUtils.convertDurationStrToLongForTest(7, "ms", "ns"));
Assert.assertEquals(7000L, DateTimeUtils.convertDurationStrToLongForTest(7, "us", "ns"));
Assert.assertEquals(7L, DateTimeUtils.convertDurationStrToLongForTest(7, "ns", "ns"));
}
/** Test convert duration including natural month unit. Time includes: 1970-01-01 ~ 1970-12-01 */
@Test
public void getConvertDurationIncludingMonthUnit() {
Assert.assertEquals(31 * 86400000L, DateTimeUtils.convertDurationStrToLong(0, 1, "mo", "ms"));
Assert.assertEquals(
28 * 86400000L, DateTimeUtils.convertDurationStrToLong(2678400000L, 1, "mo", "ms"));
Assert.assertEquals(
31 * 86400000L, DateTimeUtils.convertDurationStrToLong(5097600000L, 1, "mo", "ms"));
Assert.assertEquals(
30 * 86400000L, DateTimeUtils.convertDurationStrToLong(7776000000L, 1, "mo", "ms"));
Assert.assertEquals(
31 * 86400000L, DateTimeUtils.convertDurationStrToLong(10368000000L, 1, "mo", "ms"));
Assert.assertEquals(
30 * 86400000L, DateTimeUtils.convertDurationStrToLong(13046400000L, 1, "mo", "ms"));
Assert.assertEquals(
31 * 86400000L, DateTimeUtils.convertDurationStrToLong(15638400000L, 1, "mo", "ms"));
Assert.assertEquals(
31 * 86400000L, DateTimeUtils.convertDurationStrToLong(18316800000L, 1, "mo", "ms"));
Assert.assertEquals(
30 * 86400000L, DateTimeUtils.convertDurationStrToLong(20995200000L, 1, "mo", "ms"));
Assert.assertEquals(
31 * 86400000L, DateTimeUtils.convertDurationStrToLong(23587200000L, 1, "mo", "ms"));
Assert.assertEquals(
30 * 86400000L, DateTimeUtils.convertDurationStrToLong(26265600000L, 1, "mo", "ms"));
Assert.assertEquals(
31 * 86400000L, DateTimeUtils.convertDurationStrToLong(28857600000L, 1, "mo", "ms"));
}
public void testConvertDatetimeStrToLongWithoutMS(
ZoneOffset zoneOffset, ZoneId zoneId, long res) {
String[] timeFormatWithoutMs =
new String[] {
"2019-01-02 15:13:27",
"2019/01/02 15:13:27",
"2019.01.02 15:13:27",
"2019-01-02T15:13:27",
"2019/01/02T15:13:27",
"2019.01.02T15:13:27",
"2019-01-02 15:13:27" + zoneOffset,
"2019/01/02 15:13:27" + zoneOffset,
"2019.01.02 15:13:27" + zoneOffset,
"2019-01-02T15:13:27" + zoneOffset,
"2019/01/02T15:13:27" + zoneOffset,
"2019.01.02T15:13:27" + zoneOffset,
};
for (String str : timeFormatWithoutMs) {
Assert.assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneOffset, 0, "ms"));
}
for (String str : timeFormatWithoutMs) {
assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneId));
}
}
public void testConvertDatetimeStrToLongWithMS(ZoneOffset zoneOffset, ZoneId zoneId, long res) {
String[] timeFormatWithoutMs =
new String[] {
"2019-01-02 15:13:27.689",
"2019/01/02 15:13:27.689",
"2019.01.02 15:13:27.689",
"2019-01-02T15:13:27.689",
"2019/01/02T15:13:27.689",
"2019.01.02T15:13:27.689",
"2019-01-02 15:13:27.689" + zoneOffset,
"2019/01/02 15:13:27.689" + zoneOffset,
"2019.01.02 15:13:27.689" + zoneOffset,
"2019-01-02T15:13:27.689" + zoneOffset,
"2019/01/02T15:13:27.689" + zoneOffset,
"2019.01.02T15:13:27.689" + zoneOffset,
};
for (String str : timeFormatWithoutMs) {
assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneOffset, 0, "ms"));
}
for (String str : timeFormatWithoutMs) {
assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneId));
}
}
public void testConvertDatetimeStrToLongWithMS2(ZoneOffset zoneOffset, ZoneId zoneId, long res) {
String[] timeFormatWithoutMs =
new String[] {
"2019-01-02 15:13:27.680",
"2019/01/02 15:13:27.680",
"2019.01.02 15:13:27.680",
"2019-01-02T15:13:27.680",
"2019-01-02T15:13:27.680",
"2019/01/02T15:13:27.680",
"2019.01.02T15:13:27.680",
"2019-01-02 15:13:27.680" + zoneOffset,
"2019/01/02 15:13:27.680" + zoneOffset,
"2019.01.02 15:13:27.680" + zoneOffset,
"2019-01-02T15:13:27.680" + zoneOffset,
"2019/01/02T15:13:27.680" + zoneOffset,
"2019.01.02T15:13:27.680" + zoneOffset,
"2019-01-02 15:13:27.68",
"2019/01/02 15:13:27.68",
"2019.01.02 15:13:27.68",
"2019-01-02T15:13:27.68",
"2019-01-02T15:13:27.68",
"2019/01/02T15:13:27.68",
"2019.01.02T15:13:27.68",
"2019-01-02 15:13:27.68" + zoneOffset,
"2019/01/02 15:13:27.68" + zoneOffset,
"2019.01.02 15:13:27.68" + zoneOffset,
"2019-01-02T15:13:27.68" + zoneOffset,
"2019/01/02T15:13:27.68" + zoneOffset,
"2019.01.02T15:13:27.68" + zoneOffset,
};
for (String str : timeFormatWithoutMs) {
assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneOffset, 0, "ms"));
}
for (String str : timeFormatWithoutMs) {
assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneId));
}
}
public void testConvertDateStrToLong(ZoneOffset zoneOffset, ZoneId zoneId, long res) {
String[] timeFormatWithoutMs =
new String[] {
"2019-01-02", "2019/01/02", "2019.01.02",
};
for (String str : timeFormatWithoutMs) {
assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneOffset, 0, "ms"));
}
for (String str : timeFormatWithoutMs) {
assertEquals(res, DateTimeUtils.convertDatetimeStrToLong(str, zoneId));
}
}
@Test
public void testConstructTimeDuration() {
TimeDuration timeDuration = DateTimeUtils.constructTimeDuration("1y1d1ns");
Assert.assertEquals(12, timeDuration.monthDuration);
Assert.assertEquals(86400_000L, timeDuration.nonMonthDuration);
timeDuration = DateTimeUtils.constructTimeDuration("1y1mo1d1ms1ns");
Assert.assertEquals(13, timeDuration.monthDuration);
Assert.assertEquals(86400_001L, timeDuration.nonMonthDuration);
timeDuration = DateTimeUtils.constructTimeDuration("1d1ns");
Assert.assertEquals(0, timeDuration.monthDuration);
Assert.assertEquals(86400_000L, timeDuration.nonMonthDuration);
timeDuration = DateTimeUtils.constructTimeDuration("1y");
Assert.assertEquals(12, timeDuration.monthDuration);
Assert.assertEquals(0, timeDuration.nonMonthDuration);
timeDuration = DateTimeUtils.constructTimeDuration("1mo");
Assert.assertEquals(1, timeDuration.monthDuration);
Assert.assertEquals(0, timeDuration.nonMonthDuration);
timeDuration = DateTimeUtils.constructTimeDuration("1y1mo");
Assert.assertEquals(13, timeDuration.monthDuration);
Assert.assertEquals(0, timeDuration.nonMonthDuration);
timeDuration = DateTimeUtils.constructTimeDuration("10000000000ms");
Assert.assertEquals(10000000000L, timeDuration.nonMonthDuration);
}
}