From 5d26a106e92e80452a6ea7574addc2ce56f54823 Mon Sep 17 00:00:00 2001 From: Glavo Date: Tue, 13 Feb 2024 15:29:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20Instant=20=E6=9B=BF?= =?UTF-8?q?=E4=BB=A3=20Date=20(#2713)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update * update * update * update * update * Update * update * update * Add more tests * fix checkstyle --- .../org/jackhuang/hmcl/countly/Countly.java | 7 +- .../jackhuang/hmcl/countly/CrashReport.java | 6 +- .../hmcl/game/HMCLGameRepository.java | 3 +- .../hmcl/ui/download/VersionsPage.java | 2 +- .../org/jackhuang/hmcl/ui/main/RootPage.java | 6 +- .../jackhuang/hmcl/ui/main/SponsorPage.java | 10 +- .../hmcl/ui/versions/DownloadPage.java | 2 +- .../hmcl/download/RemoteVersion.java | 10 +- .../fabric/FabricAPIRemoteVersion.java | 4 +- .../download/forge/ForgeBMCLVersionList.java | 2 +- .../download/forge/ForgeRemoteVersion.java | 4 +- .../hmcl/download/game/GameRemoteVersion.java | 4 +- .../download/game/GameRemoteVersionInfo.java | 16 +-- .../download/quilt/QuiltAPIRemoteVersion.java | 4 +- .../jackhuang/hmcl/game/ClassicVersion.java | 4 +- .../java/org/jackhuang/hmcl/game/Version.java | 16 +-- .../hmcl/game/tlauncher/TLauncherVersion.java | 8 +- .../org/jackhuang/hmcl/mod/RemoteMod.java | 8 +- .../jackhuang/hmcl/mod/curse/CurseAddon.java | 29 ++--- .../modrinth/ModrinthRemoteModRepository.java | 27 ++--- .../java/org/jackhuang/hmcl/util/Logging.java | 45 ++++---- .../hmcl/util/gson/DateTypeAdapter.java | 106 ------------------ .../hmcl/util/gson/InstantTypeAdapter.java | 64 ++++++++--- .../jackhuang/hmcl/util/gson/JsonUtils.java | 2 - ...rTest.java => InstantTypeAdapterTest.java} | 19 +++- 25 files changed, 177 insertions(+), 231 deletions(-) delete mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/DateTypeAdapter.java rename HMCLCore/src/test/java/org/jackhuang/hmcl/util/gson/{DateTypeAdapterTest.java => InstantTypeAdapterTest.java} (52%) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/countly/Countly.java b/HMCL/src/main/java/org/jackhuang/hmcl/countly/Countly.java index f22dd1d0c..f18b19685 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/countly/Countly.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/countly/Countly.java @@ -20,10 +20,9 @@ package org.jackhuang.hmcl.countly; import org.jackhuang.hmcl.util.io.HttpRequest; import java.io.IOException; +import java.time.ZonedDateTime; import java.util.Calendar; -import java.util.Date; import java.util.Locale; -import java.util.TimeZone; import static org.jackhuang.hmcl.util.Pair.pair; @@ -40,7 +39,7 @@ public class Countly { pair("metrics", metrics), pair("device_id", deviceId), pair("timestamp", Long.toString(System.currentTimeMillis())), - pair("tz", Integer.toString(TimeZone.getDefault().getOffset(new Date().getTime()) / 60000)), + pair("tz", Integer.toString(getTimezoneOffset())), pair("hour", Integer.toString(currentHour())), pair("dow", Integer.toString(currentDayOfWeek())), pair("app_key", APP_KEY), @@ -50,7 +49,7 @@ public class Countly { } private static int getTimezoneOffset() { - return TimeZone.getDefault().getOffset(new Date().getTime()) / 60000; + return ZonedDateTime.now().getOffset().getTotalSeconds() / 60; } private static String getLocale() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java b/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java index 75f562a27..66668719b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/countly/CrashReport.java @@ -7,8 +7,8 @@ import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.OperatingSystem; import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Map; import static org.jackhuang.hmcl.util.Lang.mapOf; @@ -68,7 +68,7 @@ public class CrashReport { public String getDisplayText() { return "---- Hello Minecraft! Crash Report ----\n" + " Version: " + Metadata.VERSION + "\n" + - " Time: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "\n" + + " Time: " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()) + "\n" + " Thread: " + thread + "\n" + "\n Content: \n " + stackTrace + "\n\n" + diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index c0526e144..fdc12283b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -48,6 +48,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.time.Instant; import java.util.*; import java.util.logging.Level; import java.util.stream.Collectors; @@ -103,7 +104,7 @@ public class HMCLGameRepository extends DefaultGameRepository { public Stream getDisplayVersions() { return getVersions().stream() .filter(v -> !v.isHidden()) - .sorted(Comparator.comparing((Version v) -> v.getReleaseTime() == null ? new Date(0L) : v.getReleaseTime()) + .sorted(Comparator.comparing((Version v) -> Lang.requireNonNullElse(v.getReleaseTime(), Instant.EPOCH)) .thenComparing(v -> VersionNumber.asVersion(v.getId()))); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java index dc5703c5f..c1aec271c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java @@ -298,7 +298,7 @@ public final class VersionsPage extends BorderPane implements WizardPage, Refres content.setTitle(remoteVersion.getSelfVersion()); if (remoteVersion.getReleaseDate() != null) { - content.setSubtitle(formatDateTime(remoteVersion.getReleaseDate().toInstant())); + content.setSubtitle(formatDateTime(remoteVersion.getReleaseDate())); } else { content.setSubtitle(null); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java index b5cee07e5..7191966f9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/RootPage.java @@ -44,14 +44,15 @@ import org.jackhuang.hmcl.ui.nbt.NBTHelper; import org.jackhuang.hmcl.ui.versions.GameAdvancedListItem; import org.jackhuang.hmcl.ui.versions.Versions; import org.jackhuang.hmcl.upgrade.UpdateChecker; +import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.TaskCancellationAction; import org.jackhuang.hmcl.util.io.CompressingUtils; import org.jackhuang.hmcl.util.versioning.VersionNumber; import java.io.File; +import java.time.Instant; import java.util.Comparator; -import java.util.Date; import java.util.List; import java.util.Locale; import java.util.logging.Level; @@ -118,8 +119,7 @@ public class RootPage extends DecoratorAnimatedPage implements DecoratorPage { List children = repository.getVersions().parallelStream() .filter(version -> !version.isHidden()) .sorted(Comparator - .comparing((Version version) -> version.getReleaseTime() == null ? new Date(0L) - : version.getReleaseTime()) + .comparing((Version version) -> Lang.requireNonNullElse(version.getReleaseTime(), Instant.EPOCH)) .thenComparing(version -> VersionNumber.asVersion(repository.getGameVersion(version).orElse(version.getId())))) .collect(Collectors.toList()); runInFX(() -> { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SponsorPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SponsorPage.java index 07716990b..ea21757c6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SponsorPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SponsorPage.java @@ -34,7 +34,7 @@ import org.jackhuang.hmcl.util.Holder; import org.jackhuang.hmcl.util.io.HttpRequest; import java.math.BigDecimal; -import java.util.Date; +import java.time.Instant; import java.util.List; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -128,7 +128,7 @@ public class SponsorPage extends StackPane { private final String name; @SerializedName("create_time") - private final Date createTime; + private final Instant createTime; @SerializedName("money") private final BigDecimal money; @@ -140,10 +140,10 @@ public class SponsorPage extends StackPane { private final String afdianId; public Sponsor() { - this("", new Date(), BigDecimal.ZERO, "", ""); + this("", Instant.now(), BigDecimal.ZERO, "", ""); } - public Sponsor(String name, Date createTime, BigDecimal money, String contact, String afdianId) { + public Sponsor(String name, Instant createTime, BigDecimal money, String contact, String afdianId) { this.name = name; this.createTime = createTime; this.money = money; @@ -155,7 +155,7 @@ public class SponsorPage extends StackPane { return name; } - public Date getCreateTime() { + public Instant getCreateTime() { return createTime; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java index 5ccc6b666..db2ffd8f1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java @@ -382,7 +382,7 @@ public class DownloadPage extends Control implements DecoratorPage { TwoLineListItem content = new TwoLineListItem(); HBox.setHgrow(content, Priority.ALWAYS); content.setTitle(dataItem.getName()); - content.setSubtitle(FORMATTER.format(dataItem.getDatePublished().toInstant())); + content.setSubtitle(FORMATTER.format(dataItem.getDatePublished())); switch (dataItem.getVersionType()) { case Alpha: diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java index 9322a26af..4bc1a90c0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/RemoteVersion.java @@ -22,7 +22,7 @@ import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.ToStringBuilder; import org.jackhuang.hmcl.util.versioning.VersionNumber; -import java.util.Date; +import java.time.Instant; import java.util.List; import java.util.Objects; @@ -36,7 +36,7 @@ public class RemoteVersion implements Comparable { private final String libraryId; private final String gameVersion; private final String selfVersion; - private final Date releaseDate; + private final Instant releaseDate; private final List urls; private final Type type; @@ -47,7 +47,7 @@ public class RemoteVersion implements Comparable { * @param selfVersion the version string of the remote version. * @param urls the installer or universal jar original URL. */ - public RemoteVersion(String libraryId, String gameVersion, String selfVersion, Date releaseDate, List urls) { + public RemoteVersion(String libraryId, String gameVersion, String selfVersion, Instant releaseDate, List urls) { this(libraryId, gameVersion, selfVersion, releaseDate, Type.UNCATEGORIZED, urls); } @@ -58,7 +58,7 @@ public class RemoteVersion implements Comparable { * @param selfVersion the version string of the remote version. * @param urls the installer or universal jar URL. */ - public RemoteVersion(String libraryId, String gameVersion, String selfVersion, Date releaseDate, Type type, List urls) { + public RemoteVersion(String libraryId, String gameVersion, String selfVersion, Instant releaseDate, Type type, List urls) { this.libraryId = Objects.requireNonNull(libraryId); this.gameVersion = Objects.requireNonNull(gameVersion); this.selfVersion = Objects.requireNonNull(selfVersion); @@ -83,7 +83,7 @@ public class RemoteVersion implements Comparable { return getSelfVersion(); } - public Date getReleaseDate() { + public Instant getReleaseDate() { return releaseDate; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIRemoteVersion.java index 4bc1303d1..e1522bc93 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIRemoteVersion.java @@ -24,7 +24,7 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.mod.RemoteMod; import org.jackhuang.hmcl.task.Task; -import java.util.Date; +import java.time.Instant; import java.util.List; public class FabricAPIRemoteVersion extends RemoteVersion { @@ -38,7 +38,7 @@ public class FabricAPIRemoteVersion extends RemoteVersion { * @param selfVersion the version string of the remote version. * @param urls the installer or universal jar original URL. */ - FabricAPIRemoteVersion(String gameVersion, String selfVersion, String fullVersion, Date datePublished, RemoteMod.Version version, List urls) { + FabricAPIRemoteVersion(String gameVersion, String selfVersion, String fullVersion, Instant datePublished, RemoteMod.Version version, List urls) { super(LibraryAnalyzer.LibraryType.FABRIC_API.getPatchId(), gameVersion, selfVersion, datePublished, urls); this.fullVersion = fullVersion; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java index f71076f25..3ffd7d5ea 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java @@ -109,7 +109,7 @@ public final class ForgeBMCLVersionList extends VersionList } versions.put(gameVersion, new ForgeRemoteVersion( - version.getGameVersion(), version.getVersion(), releaseDate == null ? null : Date.from(releaseDate), urls)); + version.getGameVersion(), version.getVersion(), releaseDate, urls)); } } finally { lock.writeLock().unlock(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeRemoteVersion.java index 3f3e9bd49..5550506fc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeRemoteVersion.java @@ -23,7 +23,7 @@ import org.jackhuang.hmcl.download.RemoteVersion; import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.Task; -import java.util.Date; +import java.time.Instant; import java.util.List; public class ForgeRemoteVersion extends RemoteVersion { @@ -34,7 +34,7 @@ public class ForgeRemoteVersion extends RemoteVersion { * @param selfVersion the version string of the remote version. * @param url the installer or universal jar original URL. */ - public ForgeRemoteVersion(String gameVersion, String selfVersion, Date releaseDate, List url) { + public ForgeRemoteVersion(String gameVersion, String selfVersion, Instant releaseDate, List url) { super(LibraryAnalyzer.LibraryType.FORGE.getPatchId(), gameVersion, selfVersion, releaseDate, url); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java index 08cbd40c6..64b9a0e10 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersion.java @@ -25,7 +25,7 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.Immutable; -import java.util.Date; +import java.time.Instant; import java.util.List; /** @@ -37,7 +37,7 @@ public final class GameRemoteVersion extends RemoteVersion { private final ReleaseType type; - public GameRemoteVersion(String gameVersion, String selfVersion, List url, ReleaseType type, Date releaseDate) { + public GameRemoteVersion(String gameVersion, String selfVersion, List url, ReleaseType type, Instant releaseDate) { super(LibraryAnalyzer.LibraryType.MINECRAFT.getPatchId(), gameVersion, selfVersion, releaseDate, getReleaseType(type), url); this.type = type; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersionInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersionInfo.java index ba47ffe21..430ddec37 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersionInfo.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameRemoteVersionInfo.java @@ -24,7 +24,7 @@ import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.Validation; -import java.util.Date; +import java.time.Instant; /** * @@ -36,10 +36,10 @@ public final class GameRemoteVersionInfo implements Validation { private final String gameVersion; @SerializedName("time") - private final Date time; + private final Instant time; @SerializedName("releaseTime") - private final Date releaseTime; + private final Instant releaseTime; @SerializedName("type") private final ReleaseType type; @@ -48,14 +48,14 @@ public final class GameRemoteVersionInfo implements Validation { private final String url; public GameRemoteVersionInfo() { - this("", new Date(), new Date(), ReleaseType.UNKNOWN); + this("", Instant.now(), Instant.now(), ReleaseType.UNKNOWN); } - public GameRemoteVersionInfo(String gameVersion, Date time, Date releaseTime, ReleaseType type) { + public GameRemoteVersionInfo(String gameVersion, Instant time, Instant releaseTime, ReleaseType type) { this(gameVersion, time, releaseTime, type, Constants.DEFAULT_LIBRARY_URL + gameVersion + "/" + gameVersion + ".json"); } - public GameRemoteVersionInfo(String gameVersion, Date time, Date releaseTime, ReleaseType type, String url) { + public GameRemoteVersionInfo(String gameVersion, Instant time, Instant releaseTime, ReleaseType type, String url) { this.gameVersion = gameVersion; this.time = time; this.releaseTime = releaseTime; @@ -67,11 +67,11 @@ public final class GameRemoteVersionInfo implements Validation { return gameVersion; } - public Date getTime() { + public Instant getTime() { return time; } - public Date getReleaseTime() { + public Instant getReleaseTime() { return releaseTime; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIRemoteVersion.java index 4399c71be..c67572f39 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIRemoteVersion.java @@ -24,7 +24,7 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.mod.RemoteMod; import org.jackhuang.hmcl.task.Task; -import java.util.Date; +import java.time.Instant; import java.util.List; public class QuiltAPIRemoteVersion extends RemoteVersion { @@ -38,7 +38,7 @@ public class QuiltAPIRemoteVersion extends RemoteVersion { * @param selfVersion the version string of the remote version. * @param urls the installer or universal jar original URL. */ - QuiltAPIRemoteVersion(String gameVersion, String selfVersion, String fullVersion, Date datePublished, RemoteMod.Version version, List urls) { + QuiltAPIRemoteVersion(String gameVersion, String selfVersion, String fullVersion, Instant datePublished, RemoteMod.Version version, List urls) { super(LibraryAnalyzer.LibraryType.QUILT_API.getPatchId(), gameVersion, selfVersion, datePublished, urls); this.fullVersion = fullVersion; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java index f283eeaa7..42c8683a5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java @@ -18,8 +18,8 @@ package org.jackhuang.hmcl.game; import java.io.File; +import java.time.Instant; import java.util.Arrays; -import java.util.Date; /** * The Minecraft version for 1.5.x and earlier. @@ -32,7 +32,7 @@ public class ClassicVersion extends Version { super(true, "Classic", null, null, "${auth_player_name} ${auth_session} --workDir ${game_directory}", null, "net.minecraft.client.Minecraft", null, null, null, null, null, null, Arrays.asList(new ClassicLibrary("lwjgl"), new ClassicLibrary("jinput"), new ClassicLibrary("lwjgl_util")), - null, null, null, ReleaseType.UNKNOWN, new Date(), new Date(), 0, false, false, null); + null, null, null, ReleaseType.UNKNOWN, Instant.now(), Instant.now(), 0, false, false, null); } private static class ClassicLibrary extends Library { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java index 04f693f49..994886117 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java @@ -28,10 +28,10 @@ import org.jackhuang.hmcl.util.gson.JsonMap; import org.jackhuang.hmcl.util.gson.Validation; import org.jetbrains.annotations.Nullable; +import java.time.Instant; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -66,8 +66,8 @@ public class Version implements Comparable, Validation { private final JsonMap downloads; private final JsonMap logging; private final ReleaseType type; - private final Date time; - private final Date releaseTime; + private final Instant time; + private final Instant releaseTime; private final Integer minimumLauncherVersion; private final Boolean root; private final Boolean hidden; @@ -93,7 +93,7 @@ public class Version implements Comparable, Validation { this(false, id, version, priority, null, arguments, mainClass, null, null, null, null, null, null, libraries, null, null, null, null, null, null, null, null, null, null); } - public Version(boolean resolved, String id, String version, Integer priority, String minecraftArguments, Arguments arguments, String mainClass, String inheritsFrom, String jar, AssetIndexInfo assetIndex, String assets, Integer complianceLevel, GameJavaVersion javaVersion, List libraries, List compatibilityRules, Map downloads, Map logging, ReleaseType type, Date time, Date releaseTime, Integer minimumLauncherVersion, Boolean hidden, Boolean root, List patches) { + public Version(boolean resolved, String id, String version, Integer priority, String minecraftArguments, Arguments arguments, String mainClass, String inheritsFrom, String jar, AssetIndexInfo assetIndex, String assets, Integer complianceLevel, GameJavaVersion javaVersion, List libraries, List compatibilityRules, Map downloads, Map logging, ReleaseType type, Instant time, Instant releaseTime, Integer minimumLauncherVersion, Boolean hidden, Boolean root, List patches) { this.resolved = resolved; this.id = id; this.version = version; @@ -112,8 +112,8 @@ public class Version implements Comparable, Validation { this.downloads = downloads == null ? null : new JsonMap<>(downloads); this.logging = logging == null ? null : new JsonMap<>(logging); this.type = type; - this.time = time == null ? null : (Date) time.clone(); - this.releaseTime = releaseTime == null ? null : (Date) releaseTime.clone(); + this.time = time; + this.releaseTime = releaseTime; this.minimumLauncherVersion = minimumLauncherVersion; this.hidden = hidden; this.root = root; @@ -132,7 +132,7 @@ public class Version implements Comparable, Validation { return mainClass; } - public Date getTime() { + public Instant getTime() { return time; } @@ -158,7 +158,7 @@ public class Version implements Comparable, Validation { return type == null ? ReleaseType.UNKNOWN : type; } - public Date getReleaseTime() { + public Instant getReleaseTime() { return releaseTime; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherVersion.java index 36ed57660..98d726162 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherVersion.java @@ -24,7 +24,7 @@ import org.jackhuang.hmcl.util.gson.TolerableValidationException; import org.jackhuang.hmcl.util.gson.Validation; import org.jetbrains.annotations.Nullable; -import java.util.Date; +import java.time.Instant; import java.util.List; import java.util.stream.Collectors; @@ -46,12 +46,12 @@ public class TLauncherVersion implements Validation { private final JsonMap downloads; private final JsonMap logging; private final ReleaseType type; - private final Date time; - private final Date releaseTime; + private final Instant time; + private final Instant releaseTime; private final Integer minimumLauncherVersion; private final Integer tlauncherVersion; - public TLauncherVersion(String id, String minecraftArguments, Arguments arguments, String mainClass, String inheritsFrom, String jar, AssetIndexInfo assetIndex, String assets, Integer complianceLevel, @Nullable GameJavaVersion javaVersion, List libraries, List compatibilityRules, JsonMap downloads, JsonMap logging, ReleaseType type, Date time, Date releaseTime, Integer minimumLauncherVersion, Integer tlauncherVersion) { + public TLauncherVersion(String id, String minecraftArguments, Arguments arguments, String mainClass, String inheritsFrom, String jar, AssetIndexInfo assetIndex, String assets, Integer complianceLevel, @Nullable GameJavaVersion javaVersion, List libraries, List compatibilityRules, JsonMap downloads, JsonMap logging, ReleaseType type, Instant time, Instant releaseTime, Integer minimumLauncherVersion, Integer tlauncherVersion) { this.id = id; this.minecraftArguments = minecraftArguments; this.arguments = arguments; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteMod.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteMod.java index 95258f7c5..23365637c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteMod.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteMod.java @@ -22,7 +22,7 @@ import org.jackhuang.hmcl.mod.modrinth.ModrinthRemoteModRepository; import org.jackhuang.hmcl.task.FileDownloadTask; import java.io.IOException; -import java.util.Date; +import java.time.Instant; import java.util.List; import java.util.Map; import java.util.stream.Stream; @@ -218,14 +218,14 @@ public class RemoteMod { private final String name; private final String version; private final String changelog; - private final Date datePublished; + private final Instant datePublished; private final VersionType versionType; private final File file; private final List dependencies; private final List gameVersions; private final List loaders; - public Version(IVersion self, String modid, String name, String version, String changelog, Date datePublished, VersionType versionType, File file, List dependencies, List gameVersions, List loaders) { + public Version(IVersion self, String modid, String name, String version, String changelog, Instant datePublished, VersionType versionType, File file, List dependencies, List gameVersions, List loaders) { this.self = self; this.modid = modid; this.name = name; @@ -259,7 +259,7 @@ public class RemoteMod { return changelog; } - public Date getDatePublished() { + public Instant getDatePublished() { return datePublished; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java index fa474943a..e77fb259e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseAddon.java @@ -26,6 +26,7 @@ import org.jackhuang.hmcl.util.Pair; import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -58,15 +59,15 @@ public class CurseAddon implements RemoteMod.IMod { private final int mainFileId; private final List latestFiles; private final List latestFileIndices; - private final Date dateCreated; - private final Date dateModified; - private final Date dateReleased; + private final Instant dateCreated; + private final Instant dateModified; + private final Instant dateReleased; private final boolean allowModDistribution; private final int gamePopularityRank; private final boolean isAvailable; private final int thumbsUpCount; - public CurseAddon(int id, int gameId, String name, String slug, Links links, String summary, int status, int downloadCount, boolean isFeatured, int primaryCategoryId, List categories, int classId, List authors, Logo logo, int mainFileId, List latestFiles, List latestFileIndices, Date dateCreated, Date dateModified, Date dateReleased, boolean allowModDistribution, int gamePopularityRank, boolean isAvailable, int thumbsUpCount) { + public CurseAddon(int id, int gameId, String name, String slug, Links links, String summary, int status, int downloadCount, boolean isFeatured, int primaryCategoryId, List categories, int classId, List authors, Logo logo, int mainFileId, List latestFiles, List latestFileIndices, Instant dateCreated, Instant dateModified, Instant dateReleased, boolean allowModDistribution, int gamePopularityRank, boolean isAvailable, int thumbsUpCount) { this.id = id; this.gameId = gameId; this.name = name; @@ -161,15 +162,15 @@ public class CurseAddon implements RemoteMod.IMod { return latestFileIndices; } - public Date getDateCreated() { + public Instant getDateCreated() { return dateCreated; } - public Date getDateModified() { + public Instant getDateModified() { return dateModified; } - public Date getDateReleased() { + public Instant getDateReleased() { return dateReleased; } @@ -438,7 +439,7 @@ public class CurseAddon implements RemoteMod.IMod { private final int releaseType; private final int fileStatus; private final List hashes; - private final Date fileDate; + private final Instant fileDate; private final int fileLength; private final int downloadCount; private final String downloadUrl; @@ -448,7 +449,7 @@ public class CurseAddon implements RemoteMod.IMod { private final boolean isServerPack; private final long fileFingerprint; - public LatestFile(int id, int gameId, int modId, boolean isAvailable, String displayName, String fileName, int releaseType, int fileStatus, List hashes, Date fileDate, int fileLength, int downloadCount, String downloadUrl, List gameVersions, List dependencies, int alternateFileId, boolean isServerPack, long fileFingerprint) { + public LatestFile(int id, int gameId, int modId, boolean isAvailable, String displayName, String fileName, int releaseType, int fileStatus, List hashes, Instant fileDate, int fileLength, int downloadCount, String downloadUrl, List gameVersions, List dependencies, int alternateFileId, boolean isServerPack, long fileFingerprint) { this.id = id; this.gameId = gameId; this.modId = modId; @@ -505,7 +506,7 @@ public class CurseAddon implements RemoteMod.IMod { return hashes; } - public Date getFileDate() { + public Instant getFileDate() { return fileDate; } @@ -650,7 +651,7 @@ public class CurseAddon implements RemoteMod.IMod { private final String slug; private final String url; private final String iconUrl; - private final Date dateModified; + private final Instant dateModified; private final boolean isClass; private final int classId; private final int parentCategoryId; @@ -658,10 +659,10 @@ public class CurseAddon implements RemoteMod.IMod { private transient final List subcategories; public Category() { - this(0, 0, "", "", "", "", new Date(), false, 0, 0); + this(0, 0, "", "", "", "", Instant.now(), false, 0, 0); } - public Category(int id, int gameId, String name, String slug, String url, String iconUrl, Date dateModified, boolean isClass, int classId, int parentCategoryId) { + public Category(int id, int gameId, String name, String slug, String url, String iconUrl, Instant dateModified, boolean isClass, int classId, int parentCategoryId) { this.id = id; this.gameId = gameId; this.name = name; @@ -700,7 +701,7 @@ public class CurseAddon implements RemoteMod.IMod { return iconUrl; } - public Date getDateModified() { + public Instant getDateModified() { return dateModified; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java index e0d9cc9a5..4cc9e0632 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java @@ -32,6 +32,7 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.nio.file.Path; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -210,13 +211,13 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { private final String team; - private final Date published; + private final Instant published; - private final Date updated; + private final Instant updated; private final List versions; - public Project(String slug, String title, String description, List categories, String body, String projectType, int downloads, String iconUrl, String id, String team, Date published, Date updated, List versions) { + public Project(String slug, String title, String description, List categories, String body, String projectType, int downloads, String iconUrl, String id, String team, Instant published, Instant updated, List versions) { this.slug = slug; this.title = title; this.description = description; @@ -272,11 +273,11 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { return team; } - public Date getPublished() { + public Instant getPublished() { return published; } - public Date getUpdated() { + public Instant getUpdated() { return updated; } @@ -381,7 +382,7 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { private final String authorId; @SerializedName("date_published") - private final Date datePublished; + private final Instant datePublished; private final int downloads; @@ -390,7 +391,7 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { private final List files; - public ProjectVersion(String name, String versionNumber, String changelog, List dependencies, List gameVersions, String versionType, List loaders, boolean featured, String id, String projectId, String authorId, Date datePublished, int downloads, String changelogUrl, List files) { + public ProjectVersion(String name, String versionNumber, String changelog, List dependencies, List gameVersions, String versionType, List loaders, boolean featured, String id, String projectId, String authorId, Instant datePublished, int downloads, String changelogUrl, List files) { this.name = name; this.versionNumber = versionNumber; this.changelog = changelog; @@ -452,7 +453,7 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { return authorId; } - public Date getDatePublished() { + public Instant getDatePublished() { return datePublished; } @@ -587,15 +588,15 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { private final List versions; @SerializedName("date_created") - private final Date dateCreated; + private final Instant dateCreated; @SerializedName("date_modified") - private final Date dateModified; + private final Instant dateModified; @SerializedName("latest_version") private final String latestVersion; - public ProjectSearchResult(String slug, String title, String description, List categories, String projectType, int downloads, String iconUrl, String projectId, String author, List versions, Date dateCreated, Date dateModified, String latestVersion) { + public ProjectSearchResult(String slug, String title, String description, List categories, String projectType, int downloads, String iconUrl, String projectId, String author, List versions, Instant dateCreated, Instant dateModified, String latestVersion) { this.slug = slug; this.title = title; this.description = description; @@ -651,11 +652,11 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { return versions; } - public Date getDateCreated() { + public Instant getDateCreated() { return dateCreated; } - public Date getDateModified() { + public Instant getDateModified() { return dateModified; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java index a34625b70..48f58f6fc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Logging.java @@ -22,9 +22,10 @@ import org.jackhuang.hmcl.util.io.IOUtils; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; -import java.text.MessageFormat; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.Arrays; -import java.util.Date; import java.util.logging.*; /** @@ -120,35 +121,39 @@ public final class Logging { } } - private static final MessageFormat FORMAT = new MessageFormat("[{0,date,HH:mm:ss}] [{1}.{2}/{3}] {4}\n"); + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.systemDefault()); private static String format(LogRecord record) { String message = filterForbiddenToken(record.getMessage()); + StringBuilder builder = new StringBuilder(128 + message.length()); + builder.append('['); + TIME_FORMATTER.formatTo(Instant.ofEpochMilli(record.getMillis()), builder); + builder.append(']'); + + builder.append(" [") + .append(record.getSourceClassName()) + .append('.') + .append(record.getSourceMethodName()) + .append('/') + .append(record.getLevel().getName()) + .append("] ") + .append(message) + .append('\n'); + + Throwable thrown = record.getThrown(); - - StringWriter writer; - StringBuffer buffer; if (thrown == null) { - writer = null; - buffer = new StringBuffer(256); + return builder.toString(); } else { - writer = new StringWriter(1024); - buffer = writer.getBuffer(); - } - - FORMAT.format(new Object[]{ - new Date(record.getMillis()), - record.getSourceClassName(), record.getSourceMethodName(), record.getLevel().getName(), - message - }, buffer, null); - - if (thrown != null) { + StringWriter writer = new StringWriter(builder.length() + 2048); + writer.getBuffer().append(builder); try (PrintWriter printWriter = new PrintWriter(writer)) { thrown.printStackTrace(printWriter); } + + return writer.toString(); } - return buffer.toString(); } private static final class DefaultFormatter extends Formatter { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/DateTypeAdapter.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/DateTypeAdapter.java deleted file mode 100644 index 6d1d007b7..000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/DateTypeAdapter.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2020 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.util.gson; - -import com.google.gson.*; - -import java.lang.reflect.Type; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.time.format.DateTimeParseException; -import java.util.Date; -import java.util.Locale; - -import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME; - -/** - * - * @author huangyuhui - */ -public final class DateTypeAdapter implements JsonSerializer, JsonDeserializer { - - public static final DateTypeAdapter INSTANCE = new DateTypeAdapter(); - - private DateTypeAdapter() { - } - - @Override - public JsonElement serialize(Date t, Type type, JsonSerializationContext jsc) { - synchronized (EN_US_FORMAT) { - return new JsonPrimitive(serializeToString(t)); - } - } - - @Override - public Date deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { - if (!(json instanceof JsonPrimitive)) - throw new JsonParseException("The date should be a string value"); - else { - Date date = deserializeToDate(json.getAsString()); - if (type == Date.class) - return date; - else - throw new IllegalArgumentException(this.getClass().toString() + " cannot be deserialized to " + type); - } - } - - public static final DateFormat EN_US_FORMAT = DateFormat.getDateTimeInstance(2, 2, Locale.US); - public static final DateFormat ISO_8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); - - public static final DateTimeFormatter ISO_DATE_TIME = new DateTimeFormatterBuilder() - .append(ISO_LOCAL_DATE_TIME) - .optionalStart().appendOffset("+HH:MM", "+00:00").optionalEnd() - .optionalStart().appendOffset("+HHMM", "+0000").optionalEnd() - .optionalStart().appendOffset("+HH", "Z").optionalEnd() - .optionalStart().appendOffsetId().optionalEnd() - .toFormatter(); - - public static Date deserializeToDate(String string) { - synchronized (EN_US_FORMAT) { - try { - return EN_US_FORMAT.parse(string); - } catch (ParseException ex1) { - try { - ZonedDateTime zonedDateTime = ZonedDateTime.parse(string, ISO_DATE_TIME); - return Date.from(zonedDateTime.toInstant()); - } catch (DateTimeParseException e) { - try { - LocalDateTime localDateTime = LocalDateTime.parse(string, ISO_LOCAL_DATE_TIME); - return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); - } catch (DateTimeParseException e2) { - throw new JsonParseException("Invalid date: " + string, e); - } - } - } - } - } - - public static String serializeToString(Date date) { - synchronized (EN_US_FORMAT) { - String result = ISO_8601_FORMAT.format(date); - return result.substring(0, 22) + ":" + result.substring(22); - } - } - -} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/InstantTypeAdapter.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/InstantTypeAdapter.java index 89468f347..82af720d9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/InstantTypeAdapter.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/InstantTypeAdapter.java @@ -20,9 +20,15 @@ package org.jackhuang.hmcl.util.gson; import com.google.gson.*; import java.lang.reflect.Type; -import java.time.Instant; -import java.time.ZoneId; +import java.time.*; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.time.format.FormatStyle; +import java.time.temporal.ChronoUnit; +import java.util.Locale; + +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME; public final class InstantTypeAdapter implements JsonSerializer, JsonDeserializer { public static final InstantTypeAdapter INSTANCE = new InstantTypeAdapter(); @@ -31,21 +37,53 @@ public final class InstantTypeAdapter implements JsonSerializer, JsonDe } @Override - public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - if (!(json instanceof JsonPrimitive)) { + public JsonElement serialize(Instant t, Type type, JsonSerializationContext jsc) { + return new JsonPrimitive(serializeToString(t, ZoneId.systemDefault())); + } + + @Override + public Instant deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { + if (!(json instanceof JsonPrimitive)) throw new JsonParseException("The instant should be a string value"); - } else { - Instant instant = Instant.parse(json.getAsString()); - if (typeOfT == Instant.class) { - return instant; - } else { - throw new IllegalArgumentException(this.getClass() + " cannot be deserialized to " + typeOfT); + else { + Instant time = deserializeToInstant(json.getAsString()); + if (type == Instant.class) + return time; + else + throw new IllegalArgumentException(this.getClass() + " cannot be deserialized to " + type); + } + } + + private static final DateTimeFormatter EN_US_FORMAT = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.MEDIUM) + .withLocale(Locale.US) + .withZone(ZoneId.systemDefault()); + private static final DateTimeFormatter ISO_DATE_TIME = new DateTimeFormatterBuilder() + .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + .optionalStart().appendOffset("+HH:MM", "+00:00").optionalEnd() + .optionalStart().appendOffset("+HHMM", "+0000").optionalEnd() + .optionalStart().appendOffset("+HH", "Z").optionalEnd() + .optionalStart().appendOffsetId().optionalEnd() + .toFormatter(); + + public static Instant deserializeToInstant(String string) { + try { + return ZonedDateTime.parse(string, EN_US_FORMAT).toInstant(); + } catch (DateTimeParseException ex1) { + try { + ZonedDateTime zonedDateTime = ZonedDateTime.parse(string, ISO_DATE_TIME); + return zonedDateTime.toInstant(); + } catch (DateTimeParseException e) { + try { + LocalDateTime localDateTime = LocalDateTime.parse(string, ISO_LOCAL_DATE_TIME); + return localDateTime.atZone(ZoneId.systemDefault()).toInstant(); + } catch (DateTimeParseException e2) { + throw new JsonParseException("Invalid instant: " + string, e); + } } } } - @Override - public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) { - return new JsonPrimitive(DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneId.systemDefault()).format(src)); + public static String serializeToString(Instant instant, ZoneId zone) { + return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(ZonedDateTime.ofInstant(instant, zone).truncatedTo(ChronoUnit.SECONDS)); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/JsonUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/JsonUtils.java index fec40f665..cbd5f88e2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/JsonUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/gson/JsonUtils.java @@ -29,7 +29,6 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.time.Instant; -import java.util.Date; import java.util.UUID; /** @@ -113,7 +112,6 @@ public final class JsonUtils { .enableComplexMapKeySerialization() .setPrettyPrinting() .registerTypeAdapter(Instant.class, InstantTypeAdapter.INSTANCE) - .registerTypeAdapter(Date.class, DateTypeAdapter.INSTANCE) .registerTypeAdapter(UUID.class, UUIDTypeAdapter.INSTANCE) .registerTypeAdapter(File.class, FileTypeAdapter.INSTANCE) .registerTypeAdapterFactory(ValidationTypeAdapterFactory.INSTANCE) diff --git a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/gson/DateTypeAdapterTest.java b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/gson/InstantTypeAdapterTest.java similarity index 52% rename from HMCLCore/src/test/java/org/jackhuang/hmcl/util/gson/DateTypeAdapterTest.java rename to HMCLCore/src/test/java/org/jackhuang/hmcl/util/gson/InstantTypeAdapterTest.java index 66f34c406..649afa883 100644 --- a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/gson/DateTypeAdapterTest.java +++ b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/gson/InstantTypeAdapterTest.java @@ -2,29 +2,38 @@ package org.jackhuang.hmcl.util.gson; import org.junit.jupiter.api.Test; +import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import static org.junit.jupiter.api.Assertions.*; -public class DateTypeAdapterTest { +public class InstantTypeAdapterTest { @Test - public void parse() { + public void testDeserialize() { assertEquals( LocalDateTime.of(2017, 6, 8, 4, 26, 33) .atOffset(ZoneOffset.UTC).toInstant(), - DateTypeAdapter.deserializeToDate("2017-06-08T04:26:33+0000").toInstant()); + InstantTypeAdapter.deserializeToInstant("2017-06-08T04:26:33+0000")); assertEquals( LocalDateTime.of(2021, 1, 3, 0, 53, 34) .atOffset(ZoneOffset.UTC).toInstant(), - DateTypeAdapter.deserializeToDate("2021-01-03T00:53:34+00:00").toInstant()); + InstantTypeAdapter.deserializeToInstant("2021-01-03T00:53:34+00:00")); assertEquals( LocalDateTime.of(2021, 1, 3, 0, 53, 34) .atZone(ZoneId.systemDefault()).toInstant(), - DateTypeAdapter.deserializeToDate("2021-01-03T00:53:34").toInstant()); + InstantTypeAdapter.deserializeToInstant("2021-01-03T00:53:34")); + } + + @Test + public void testSerialize() { + assertEquals( + "2024-02-13T15:11:06+08:00", + InstantTypeAdapter.serializeToString(Instant.ofEpochMilli(1707808266154L), ZoneOffset.ofHours(8)) + ); } }