diff --git a/fine-joda/src/main/java/com/fr/third/joda/time/tz/ZoneInfoProvider.java b/fine-joda/src/main/java/com/fr/third/joda/time/tz/ZoneInfoProvider.java index 948067514..3cddda70e 100644 --- a/fine-joda/src/main/java/com/fr/third/joda/time/tz/ZoneInfoProvider.java +++ b/fine-joda/src/main/java/com/fr/third/joda/time/tz/ZoneInfoProvider.java @@ -15,6 +15,7 @@ */ package com.fr.third.joda.time.tz; +import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; @@ -24,6 +25,7 @@ import java.lang.ref.SoftReference; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -52,6 +54,8 @@ public class ZoneInfoProvider implements Provider { private final Map iZoneInfoMap; /** Maps ids to strings or SoftReferences to DateTimeZones. */ private final Set iZoneInfoKeys; + /** 内置可能加载不到的带加号的资源文件. */ + private static Map GMTData = new HashMap(); /** * Search the default classloader resource path for compiled data files. @@ -217,12 +221,18 @@ public class ZoneInfoProvider implements Provider { } }); if (in == null) { - StringBuilder buf = new StringBuilder(40) - .append("Resource not found: \"") - .append(path) - .append("\" ClassLoader: ") - .append(iLoader != null ? iLoader.toString() : "system"); - throw new IOException(buf.toString()); + if (name.contains("+")) { + name = name.substring(name.indexOf("/") + 1); + byte[] data = GMTData.get(name); + return new ByteArrayInputStream(data); + } else { + StringBuilder buf = new StringBuilder(40) + .append("Resource not found: \"") + .append(path) + .append("\" ClassLoader: ") + .append(iLoader != null ? iLoader.toString() : "system"); + throw new IOException(buf.toString()); + } } } return in; @@ -302,4 +312,18 @@ public class ZoneInfoProvider implements Provider { } } + static { + GMTData.put("GMT+1", new byte[]{70, 0, 3, 45, 48, 49, 62, 62}); + GMTData.put("GMT+2", new byte[]{70, 0, 3, 45, 48, 50, 60, 60}); + GMTData.put("GMT+3", new byte[]{70, 0, 3, 45, 48, 51, 58, 58}); + GMTData.put("GMT+4", new byte[]{70, 0, 3, 45, 48, 52, 56, 56}); + GMTData.put("GMT+5", new byte[]{70, 0, 3, 45, 48, 53, 54, 54}); + GMTData.put("GMT+6", new byte[]{70, 0, 3, 45, 48, 54, 52, 52}); + GMTData.put("GMT+7", new byte[]{70, 0, 3, 45, 48, 55, 50, 50}); + GMTData.put("GMT+8", new byte[]{70, 0, 3, 45, 48, 56, 48, 48}); + GMTData.put("GMT+9", new byte[]{70, 0, 3, 45, 48, 57, 46, 46}); + GMTData.put("GMT+10", new byte[]{70, 0, 3, 45, 49, 48, 44, 44}); + GMTData.put("GMT+11", new byte[]{70, 0, 3, 45, 49, 49, 42, 42}); + } + } diff --git a/fine-joda/src/test/java/com/fr/third/joda/time/tz/ZoneInfoProviderTest.java b/fine-joda/src/test/java/com/fr/third/joda/time/tz/ZoneInfoProviderTest.java new file mode 100644 index 000000000..19103c0dd --- /dev/null +++ b/fine-joda/src/test/java/com/fr/third/joda/time/tz/ZoneInfoProviderTest.java @@ -0,0 +1,35 @@ +package com.fr.third.joda.time.tz; + +import org.junit.Test; + +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import static org.junit.Assert.*; + +/** + * @author Afly + * created on 2020-12-16 + */ +public class ZoneInfoProviderTest { + + @Test + public void testGetResource() throws IOException, NoSuchMethodException { + ZoneInfoProvider zoneInfoProvider = new ZoneInfoProvider(); + assertNotNull(zoneInfoProvider.getZone("Etc/GMT+8")); + Method openResource = zoneInfoProvider.getClass().getDeclaredMethod("openResource", String.class); + openResource.setAccessible(true); + try { + openResource.invoke(zoneInfoProvider, "Etc/Exception+8"); + fail(); + } catch (Exception ignored) { + } + + try { + openResource.invoke(zoneInfoProvider, "Etc/Exception-8"); + fail(); + } catch (Exception ignored) { + } + } +} \ No newline at end of file