diff --git a/pom.xml b/pom.xml index 9522573..7af814a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.nablarch.framework nablarch-core - 2.0.0 + 2.1.0 scm:git:git://github.com/nablarch/${project.artifactId}.git @@ -17,7 +17,7 @@ com.nablarch nablarch-parent - 6 + 6u1 diff --git a/src/main/java/nablarch/core/date/SystemTimeUtil.java b/src/main/java/nablarch/core/date/SystemTimeUtil.java index e4bbcf0..23c9dff 100644 --- a/src/main/java/nablarch/core/date/SystemTimeUtil.java +++ b/src/main/java/nablarch/core/date/SystemTimeUtil.java @@ -2,8 +2,11 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.Date; +import java.util.TimeZone; +import nablarch.core.ThreadContext; import nablarch.core.repository.SystemRepository; import nablarch.core.util.annotation.Published; @@ -53,6 +56,17 @@ public static Timestamp getTimestamp() { return getProvider().getTimestamp(); } + /** + * システム日時を取得する。 + * + * @return システム日時 + */ + public static LocalDateTime getLocalDateTime(){ + TimeZone tz = getTimeZone(); + + return getTimestamp().toInstant().atZone(tz.toZoneId()).toLocalDateTime(); + } + /** * システム日付を yyyyMMdd 形式の文字列で取得する。 * @@ -99,4 +113,19 @@ private static SystemTimeProvider getProvider() { } return provider; } + + /** + * タイムゾーンを取得する。 + * + *

設定されているタイムゾーンを取得する。 + * + * @return スレッドコンテキストに設定されているタイムゾーン。スレッドコンテキストにタイムゾーンが設定されていない場合は、システムデフォルトのタイムゾーン。 + */ + private static TimeZone getTimeZone(){ + TimeZone timeZone = ThreadContext.getTimeZone(); + if (timeZone != null) { + return timeZone; + } + return TimeZone.getDefault(); + } } diff --git a/src/test/java/nablarch/core/date/SystemTimeUtilTest.java b/src/test/java/nablarch/core/date/SystemTimeUtilTest.java index 7a93c24..1dfce2c 100644 --- a/src/test/java/nablarch/core/date/SystemTimeUtilTest.java +++ b/src/test/java/nablarch/core/date/SystemTimeUtilTest.java @@ -1,31 +1,34 @@ package nablarch.core.date; import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.assertThrows; import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; -import java.util.Map; +import java.util.TimeZone; -import nablarch.core.repository.ObjectLoader; +import nablarch.core.ThreadContext; import nablarch.core.repository.SystemRepository; import nablarch.util.FixedSystemTimeProvider; -import org.junit.Assert; +import org.junit.After; +import org.hamcrest.MatcherAssert; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; /** * {@link SystemTimeUtil}のテストクラス * @author Miki Habu */ public class SystemTimeUtilTest { - - @Rule - public ExpectedException expectedException = ExpectedException.none(); + + private TimeZone defaultTimeZone; /** * テスト実施前準備 @@ -33,19 +36,26 @@ public class SystemTimeUtilTest { */ @Before public void setUp() { + defaultTimeZone = TimeZone.getDefault(); // リポジトリの初期化 - SystemRepository.load(new ObjectLoader() { - @Override - public Map load() { - HashMap result = new HashMap(); - FixedSystemTimeProvider provider = new FixedSystemTimeProvider(); - provider.setFixedDate("20110107123456"); - result.put("systemTimeProvider", provider); - return result; - } + SystemRepository.load(() -> { + HashMap result = new HashMap<>(); + FixedSystemTimeProvider provider = new FixedSystemTimeProvider(); + provider.setFixedDate("20110107123456"); + result.put("systemTimeProvider", provider); + return result; }); } - + + /** + * テスト実施後処理 + * + */ + @After + public void tearDown() { + TimeZone.setDefault(defaultTimeZone); + } + /** * {@link SystemTimeUtil#getDate()}のテスト * @@ -55,22 +65,19 @@ public Map load() { public void testGetDate() throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); Date expected = sdf.parse("20110107123456000"); - Assert.assertThat(SystemTimeUtil.getDate(), is(expected)); + MatcherAssert.assertThat(SystemTimeUtil.getDate(), is(expected)); } /** * {@link SystemTimeUtil#getDate()} のテスト。 *

* リポジトリに値がない場合、例外を送出するかどうか。 - * @throws Exception */ @Test - public void testGetDateErr() throws Exception { + public void testGetDateErr() { SystemRepository.clear(); - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("specified systemTimeProvider is not registered in SystemRepository."); - - SystemTimeUtil.getDate(); + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, SystemTimeUtil::getDate); + MatcherAssert.assertThat(exception.getMessage(), is("specified systemTimeProvider is not registered in SystemRepository.")); } /** @@ -79,7 +86,44 @@ public void testGetDateErr() throws Exception { @Test public void testGetTimestamp() { Timestamp expected = Timestamp.valueOf("2011-01-07 12:34:56.000000000"); - Assert.assertThat(SystemTimeUtil.getTimestamp(), is(expected)); + MatcherAssert.assertThat(SystemTimeUtil.getTimestamp(), is(expected)); + } + + /** + * {@link SystemTimeUtil#getLocalDateTime()}のテスト + *

+ * スレッドコンテキストにタイムゾーンが設定されていない場合、システムデフォルトのタイムゾーンを使用して{@link LocalDateTime}を取得できること。 + */ + @Test + public void testGetLocalDateTimeDefault() { + ThreadContext.setTimeZone(null); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + + LocalDateTime expected = ZonedDateTime + .parse( + "2011-01-07T12:34:56", + DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(defaultTimeZone.toZoneId()) + )// 文字列を、システムデフォルトのタイムゾーンの日時と考えるようにしたうえで変換 + .withZoneSameInstant(ZoneId.of("America/Los_Angeles"))// タイムゾーンをアメリカに変更 + .toLocalDateTime(); + + MatcherAssert.assertThat(SystemTimeUtil.getLocalDateTime(), is(expected)); + } + + /** + * {@link SystemTimeUtil#getLocalDateTime()} のテスト。 + *

+ * スレッドコンテキストにタイムゾーンが設定されている場合、スレッドコンテキストのタイムゾーンを使用する。 + */ + @Test + public void testGetLocalDateTime() { + ThreadContext.setTimeZone(defaultTimeZone); + TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); + + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuuMMddHHmmss"); + LocalDateTime expected = LocalDateTime.parse("20110107123456", dtf); + + MatcherAssert.assertThat(SystemTimeUtil.getLocalDateTime(), is(expected)); } /** @@ -87,7 +131,7 @@ public void testGetTimestamp() { */ @Test public void testGetCurrentDateString() { - Assert.assertThat(SystemTimeUtil.getDateString(), is("20110107")); + MatcherAssert.assertThat(SystemTimeUtil.getDateString(), is("20110107")); } /** @@ -95,7 +139,7 @@ public void testGetCurrentDateString() { */ @Test public void testGetDateTimeString() { - Assert.assertThat(SystemTimeUtil.getDateTimeString(), is("20110107123456")); + MatcherAssert.assertThat(SystemTimeUtil.getDateTimeString(), is("20110107123456")); } /** @@ -103,7 +147,7 @@ public void testGetDateTimeString() { */ @Test public void testGetDateTimeMillisString() { - Assert.assertThat(SystemTimeUtil.getDateTimeMillisString(), is("20110107123456000")); + MatcherAssert.assertThat(SystemTimeUtil.getDateTimeMillisString(), is("20110107123456000")); } }