Search in sources :

Example 61 with TimeZone

use of android.icu.util.TimeZone in project j2objc by google.

the class TimeZoneFormatTest method TestTimeRoundTrip.

/*
     * Test case of round trip time and text.  This test case detects every canonical TimeZone's
     * rule transition since 1900 until 2020, then check if time around each transition can
     * round trip as expected.
     */
@Test
public void TestTimeRoundTrip() {
    boolean TEST_ALL = getBooleanProperty("TimeZoneRoundTripAll", false);
    int startYear, endYear;
    if (TEST_ALL || TestFmwk.getExhaustiveness() > 5) {
        startYear = 1900;
    } else {
        startYear = 1990;
    }
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    endYear = cal.get(Calendar.YEAR) + 3;
    cal.set(startYear, Calendar.JANUARY, 1);
    final long START_TIME = cal.getTimeInMillis();
    cal.set(endYear, Calendar.JANUARY, 1);
    final long END_TIME = cal.getTimeInMillis();
    // These patterns are ambiguous at DST->STD local time overlap
    List<String> AMBIGUOUS_DST_DECESSION = Arrays.asList("v", "vvvv", "V", "VV", "VVV", "VVVV");
    // These patterns are ambiguous at STD->STD/DST->DST local time overlap
    List<String> AMBIGUOUS_NEGATIVE_SHIFT = Arrays.asList("z", "zzzz", "v", "vvvv", "V", "VV", "VVV", "VVVV");
    // These patterns only support integer minutes offset
    List<String> MINUTES_OFFSET = Arrays.asList("X", "XX", "XXX", "x", "xx", "xxx");
    // Regex pattern used for filtering zone IDs without exemplar location
    final Pattern LOC_EXCLUSION_PATTERN = Pattern.compile("Etc/.*|SystemV/.*|.*/Riyadh8[7-9]");
    final String BASEPATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS";
    ULocale[] LOCALES = null;
    // timer for performance analysis
    long[] times = new long[PATTERNS.length];
    long timer;
    if (TEST_ALL) {
        // It may take about an hour for testing all locales
        LOCALES = ULocale.getAvailableLocales();
    } else if (TestFmwk.getExhaustiveness() > 5) {
        LOCALES = new ULocale[] { new ULocale("ar_EG"), new ULocale("bg_BG"), new ULocale("ca_ES"), new ULocale("da_DK"), new ULocale("de"), new ULocale("de_DE"), new ULocale("el_GR"), new ULocale("en"), new ULocale("en_AU"), new ULocale("en_CA"), new ULocale("en_US"), new ULocale("es"), new ULocale("es_ES"), new ULocale("es_MX"), new ULocale("fi_FI"), new ULocale("fr"), new ULocale("fr_CA"), new ULocale("fr_FR"), new ULocale("he_IL"), new ULocale("hu_HU"), new ULocale("it"), new ULocale("it_IT"), new ULocale("ja"), new ULocale("ja_JP"), new ULocale("ko"), new ULocale("ko_KR"), new ULocale("nb_NO"), new ULocale("nl_NL"), new ULocale("nn_NO"), new ULocale("pl_PL"), new ULocale("pt"), new ULocale("pt_BR"), new ULocale("pt_PT"), new ULocale("ru_RU"), new ULocale("sv_SE"), new ULocale("th_TH"), new ULocale("tr_TR"), new ULocale("zh"), new ULocale("zh_Hans"), new ULocale("zh_Hans_CN"), new ULocale("zh_Hant"), new ULocale("zh_Hant_HK"), new ULocale("zh_Hant_TW") };
    } else {
        LOCALES = new ULocale[] { new ULocale("en") };
    }
    SimpleDateFormat sdfGMT = new SimpleDateFormat(BASEPATTERN);
    sdfGMT.setTimeZone(TimeZone.getTimeZone("Etc/GMT"));
    long testCounts = 0;
    long[] testTimes = new long[4];
    boolean[] expectedRoundTrip = new boolean[4];
    int testLen = 0;
    for (int locidx = 0; locidx < LOCALES.length; locidx++) {
        logln("Locale: " + LOCALES[locidx].toString());
        for (int patidx = 0; patidx < PATTERNS.length; patidx++) {
            logln("    pattern: " + PATTERNS[patidx]);
            String pattern = BASEPATTERN + " " + PATTERNS[patidx];
            SimpleDateFormat sdf = new SimpleDateFormat(pattern, LOCALES[locidx]);
            boolean minutesOffset = MINUTES_OFFSET.contains(PATTERNS[patidx]);
            Set<String> ids = null;
            if (JDKTZ) {
                ids = new TreeSet<String>();
                String[] jdkIDs = java.util.TimeZone.getAvailableIDs();
                for (String jdkID : jdkIDs) {
                    if (EXCL_TZ_PATTERN.matcher(jdkID).matches()) {
                        continue;
                    }
                    String tmpID = TimeZone.getCanonicalID(jdkID);
                    if (tmpID != null) {
                        ids.add(tmpID);
                    }
                }
            } else {
                ids = TimeZone.getAvailableIDs(SystemTimeZoneType.CANONICAL, null, null);
            }
            for (String id : ids) {
                if (PATTERNS[patidx].equals("V")) {
                    // Some zones do not have short ID assigned, such as Asia/Riyadh87.
                    // The time roundtrip will fail for such zones with pattern "V" (short zone ID).
                    // This is expected behavior.
                    String shortZoneID = ZoneMeta.getShortID(id);
                    if (shortZoneID == null) {
                        continue;
                    }
                } else if (PATTERNS[patidx].equals("VVV")) {
                    // This is expected behavior.
                    if (id.indexOf('/') < 0 || LOC_EXCLUSION_PATTERN.matcher(id).matches()) {
                        continue;
                    }
                }
                if (id.equals("Pacific/Apia") && PATTERNS[patidx].equals("vvvv") && logKnownIssue("11052", "Ambiguous zone name - Samoa Time")) {
                    continue;
                }
                BasicTimeZone btz = (BasicTimeZone) TimeZone.getTimeZone(id, TimeZone.TIMEZONE_ICU);
                TimeZone tz = TimeZone.getTimeZone(id);
                sdf.setTimeZone(tz);
                long t = START_TIME;
                TimeZoneTransition tzt = null;
                boolean middle = true;
                boolean last = false;
                while (t < END_TIME) {
                    if (tzt == null) {
                        testTimes[0] = t;
                        expectedRoundTrip[0] = true;
                        testLen = 1;
                    } else {
                        int fromOffset = tzt.getFrom().getRawOffset() + tzt.getFrom().getDSTSavings();
                        int toOffset = tzt.getTo().getRawOffset() + tzt.getTo().getDSTSavings();
                        int delta = toOffset - fromOffset;
                        if (delta < 0) {
                            boolean isDstDecession = tzt.getFrom().getDSTSavings() > 0 && tzt.getTo().getDSTSavings() == 0;
                            testTimes[0] = t + delta - 1;
                            expectedRoundTrip[0] = true;
                            testTimes[1] = t + delta;
                            expectedRoundTrip[1] = isDstDecession ? !AMBIGUOUS_DST_DECESSION.contains(PATTERNS[patidx]) : !AMBIGUOUS_NEGATIVE_SHIFT.contains(PATTERNS[patidx]);
                            testTimes[2] = t - 1;
                            expectedRoundTrip[2] = isDstDecession ? !AMBIGUOUS_DST_DECESSION.contains(PATTERNS[patidx]) : !AMBIGUOUS_NEGATIVE_SHIFT.contains(PATTERNS[patidx]);
                            testTimes[3] = t;
                            expectedRoundTrip[3] = true;
                            testLen = 4;
                        } else {
                            testTimes[0] = t - 1;
                            expectedRoundTrip[0] = true;
                            testTimes[1] = t;
                            expectedRoundTrip[1] = true;
                            testLen = 2;
                        }
                    }
                    for (int testidx = 0; testidx < testLen; testidx++) {
                        testCounts++;
                        timer = System.currentTimeMillis();
                        String text = sdf.format(new Date(testTimes[testidx]));
                        try {
                            Date parsedDate = sdf.parse(text);
                            long restime = parsedDate.getTime();
                            long timeDiff = restime - testTimes[testidx];
                            boolean bTimeMatch = minutesOffset ? (timeDiff / 60000) * 60000 == 0 : timeDiff == 0;
                            if (!bTimeMatch) {
                                StringBuffer msg = new StringBuffer();
                                msg.append("Time round trip failed for ").append("tzid=").append(id).append(", locale=").append(LOCALES[locidx]).append(", pattern=").append(PATTERNS[patidx]).append(", text=").append(text).append(", gmt=").append(sdfGMT.format(new Date(testTimes[testidx]))).append(", time=").append(testTimes[testidx]).append(", restime=").append(restime).append(", diff=").append(timeDiff);
                                if (expectedRoundTrip[testidx] && !isSpecialTimeRoundTripCase(LOCALES[locidx], id, PATTERNS[patidx], testTimes[testidx])) {
                                    errln("FAIL: " + msg.toString());
                                } else if (REALLY_VERBOSE_LOG) {
                                    logln(msg.toString());
                                }
                            }
                        } catch (ParseException pe) {
                            errln("FAIL: " + pe.getMessage() + " tzid=" + id + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", text=" + text);
                        }
                        times[patidx] += System.currentTimeMillis() - timer;
                    }
                    if (last) {
                        break;
                    }
                    tzt = btz.getNextTransition(t, false);
                    if (tzt == null) {
                        last = true;
                        t = END_TIME - 1;
                    } else if (middle) {
                        // Test the date in the middle of two transitions.
                        t += (tzt.getTime() - t) / 2;
                        middle = false;
                        tzt = null;
                    } else {
                        t = tzt.getTime();
                    }
                }
            }
        }
    }
    long total = 0;
    logln("### Elapsed time by patterns ###");
    for (int i = 0; i < PATTERNS.length; i++) {
        logln(times[i] + "ms (" + PATTERNS[i] + ")");
        total += times[i];
    }
    logln("Total: " + total + "ms");
    logln("Iteration: " + testCounts);
}
Also used : Pattern(java.util.regex.Pattern) ULocale(android.icu.util.ULocale) Calendar(android.icu.util.Calendar) Date(java.util.Date) BasicTimeZone(android.icu.util.BasicTimeZone) SimpleTimeZone(android.icu.util.SimpleTimeZone) TimeZone(android.icu.util.TimeZone) BasicTimeZone(android.icu.util.BasicTimeZone) TimeZoneTransition(android.icu.util.TimeZoneTransition) ParseException(java.text.ParseException) SimpleDateFormat(android.icu.text.SimpleDateFormat) Test(org.junit.Test)

Example 62 with TimeZone

use of android.icu.util.TimeZone in project j2objc by google.

the class TimeZoneFormatTest method TestParse.

@Test
public void TestParse() {
    final Object[][] DATA = { // parseOptions            expected            outpos      time type
    { "Z", 0, "en_US", Style.ISO_EXTENDED_FULL, null, "Etc/GMT", 1, TimeType.UNKNOWN }, { "Z", 0, "en_US", Style.SPECIFIC_LONG, null, "Etc/GMT", 1, TimeType.UNKNOWN }, { "Zambia time", 0, "en_US", Style.ISO_EXTENDED_FULL, EnumSet.of(ParseOption.ALL_STYLES), "Etc/GMT", 1, TimeType.UNKNOWN }, { "Zambia time", 0, "en_US", Style.GENERIC_LOCATION, null, "Africa/Lusaka", 11, TimeType.UNKNOWN }, { "Zambia time", 0, "en_US", Style.ISO_BASIC_LOCAL_FULL, EnumSet.of(ParseOption.ALL_STYLES), "Africa/Lusaka", 11, TimeType.UNKNOWN }, { "+00:00", 0, "en_US", Style.ISO_EXTENDED_FULL, null, "Etc/GMT", 6, TimeType.UNKNOWN }, { "-01:30:45", 0, "en_US", Style.ISO_EXTENDED_FULL, null, "GMT-01:30:45", 9, TimeType.UNKNOWN }, { "-7", 0, "en_US", Style.ISO_BASIC_LOCAL_FULL, null, "GMT-07:00", 2, TimeType.UNKNOWN }, { "-2222", 0, "en_US", Style.ISO_BASIC_LOCAL_FULL, null, "GMT-22:22", 5, TimeType.UNKNOWN }, { "-3333", 0, "en_US", Style.ISO_BASIC_LOCAL_FULL, null, "GMT-03:33", 4, TimeType.UNKNOWN }, { "XXX+01:30YYY", 3, "en_US", Style.LOCALIZED_GMT, null, "GMT+01:30", 9, TimeType.UNKNOWN }, { "GMT0", 0, "en_US", Style.SPECIFIC_SHORT, null, "Etc/GMT", 3, TimeType.UNKNOWN }, { "EST", 0, "en_US", Style.SPECIFIC_SHORT, null, "America/New_York", 3, TimeType.STANDARD }, { "ESTx", 0, "en_US", Style.SPECIFIC_SHORT, null, "America/New_York", 3, TimeType.STANDARD }, { "EDTx", 0, "en_US", Style.SPECIFIC_SHORT, null, "America/New_York", 3, TimeType.DAYLIGHT }, { "EST", 0, "en_US", Style.SPECIFIC_LONG, null, null, 0, TimeType.UNKNOWN }, { "EST", 0, "en_US", Style.SPECIFIC_LONG, EnumSet.of(ParseOption.ALL_STYLES), "America/New_York", 3, TimeType.STANDARD }, { "EST", 0, "en_CA", Style.SPECIFIC_SHORT, null, "America/Toronto", 3, TimeType.STANDARD }, { "CST", 0, "en_US", Style.SPECIFIC_SHORT, null, "America/Chicago", 3, TimeType.STANDARD }, { "CST", 0, "en_GB", Style.SPECIFIC_SHORT, null, null, 0, TimeType.UNKNOWN }, { "CST", 0, "en_GB", Style.SPECIFIC_SHORT, EnumSet.of(ParseOption.TZ_DATABASE_ABBREVIATIONS), "America/Chicago", 3, TimeType.STANDARD }, { "--CST--", 2, "en_GB", Style.SPECIFIC_SHORT, EnumSet.of(ParseOption.TZ_DATABASE_ABBREVIATIONS), "America/Chicago", 5, TimeType.STANDARD }, { "CST", 0, "zh_CN", Style.SPECIFIC_SHORT, EnumSet.of(ParseOption.TZ_DATABASE_ABBREVIATIONS), "Asia/Shanghai", 3, TimeType.STANDARD }, { "AEST", 0, "en_AU", Style.SPECIFIC_SHORT, EnumSet.of(ParseOption.TZ_DATABASE_ABBREVIATIONS), "Australia/Sydney", 4, TimeType.STANDARD }, { "AST", 0, "ar_SA", Style.SPECIFIC_SHORT, EnumSet.of(ParseOption.TZ_DATABASE_ABBREVIATIONS), "Asia/Riyadh", 3, TimeType.STANDARD }, { "AQTST", 0, "en", Style.SPECIFIC_LONG, null, null, 0, TimeType.UNKNOWN }, { "AQTST", 0, "en", Style.SPECIFIC_LONG, EnumSet.of(ParseOption.ALL_STYLES), null, 0, TimeType.UNKNOWN }, { "AQTST", 0, "en", Style.SPECIFIC_LONG, EnumSet.of(ParseOption.ALL_STYLES, ParseOption.TZ_DATABASE_ABBREVIATIONS), "Asia/Aqtobe", 5, TimeType.DAYLIGHT }, { "hora de verano británica", 0, "es", Style.SPECIFIC_LONG, null, "Europe/London", 24, TimeType.DAYLIGHT } };
    for (Object[] test : DATA) {
        String text = (String) test[0];
        int inPos = (Integer) test[1];
        ULocale loc = new ULocale((String) test[2]);
        Style style = (Style) test[3];
        EnumSet<ParseOption> options = (EnumSet<ParseOption>) test[4];
        String expID = (String) test[5];
        int expPos = (Integer) test[6];
        TimeType expType = (TimeType) test[7];
        TimeZoneFormat tzfmt = TimeZoneFormat.getInstance(loc);
        Output<TimeType> timeType = new Output<TimeType>(TimeType.UNKNOWN);
        ParsePosition pos = new ParsePosition(inPos);
        TimeZone tz = tzfmt.parse(style, text, pos, options, timeType);
        String errMsg = null;
        if (tz == null) {
            if (expID != null) {
                errMsg = "Parse failure - expected: " + expID;
            }
        } else if (!tz.getID().equals(expID)) {
            errMsg = "Time zone ID: " + tz.getID() + " - expected: " + expID;
        } else if (pos.getIndex() != expPos) {
            errMsg = "Parsed pos: " + pos.getIndex() + " - expected: " + expPos;
        } else if (timeType.value != expType) {
            errMsg = "Time type: " + timeType + " - expected: " + expType;
        }
        if (errMsg != null) {
            errln("Fail: " + errMsg + " [text=" + text + ", pos=" + inPos + ", locale=" + loc + ", style=" + style + "]");
        }
    }
}
Also used : ULocale(android.icu.util.ULocale) EnumSet(java.util.EnumSet) TimeZoneFormat(android.icu.text.TimeZoneFormat) TimeType(android.icu.text.TimeZoneFormat.TimeType) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) SimpleTimeZone(android.icu.util.SimpleTimeZone) TimeZone(android.icu.util.TimeZone) BasicTimeZone(android.icu.util.BasicTimeZone) Output(android.icu.util.Output) Style(android.icu.text.TimeZoneFormat.Style) ParseOption(android.icu.text.TimeZoneFormat.ParseOption) ParsePosition(java.text.ParsePosition) Test(org.junit.Test)

Example 63 with TimeZone

use of android.icu.util.TimeZone in project j2objc by google.

the class TimeZoneFormatTest method TestTimeZoneRoundTrip.

/*
     * Test case for checking if a TimeZone is properly set in the result calendar
     * and if the result TimeZone has the expected behavior.
     */
@Test
public void TestTimeZoneRoundTrip() {
    boolean TEST_ALL = getBooleanProperty("TimeZoneRoundTripAll", false);
    TimeZone unknownZone = new SimpleTimeZone(-31415, "Etc/Unknown");
    int badDstOffset = -1234;
    int badZoneOffset = -2345;
    int[][] testDateData = { { 2007, 1, 15 }, { 2007, 6, 15 }, { 1990, 1, 15 }, { 1990, 6, 15 }, { 1960, 1, 15 }, { 1960, 6, 15 } };
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.clear();
    // Set up rule equivalency test range
    long low, high;
    cal.set(1900, 0, 1);
    low = cal.getTimeInMillis();
    cal.set(2040, 0, 1);
    high = cal.getTimeInMillis();
    // Set up test dates
    Date[] DATES = new Date[testDateData.length];
    cal.clear();
    for (int i = 0; i < DATES.length; i++) {
        cal.set(testDateData[i][0], testDateData[i][1], testDateData[i][2]);
        DATES[i] = cal.getTime();
    }
    // Set up test locales
    ULocale[] LOCALES = null;
    if (TEST_ALL || TestFmwk.getExhaustiveness() > 5) {
        LOCALES = ULocale.getAvailableLocales();
    } else {
        LOCALES = new ULocale[] { new ULocale("en"), new ULocale("en_CA"), new ULocale("fr"), new ULocale("zh_Hant") };
    }
    String[] tzids;
    if (JDKTZ) {
        tzids = java.util.TimeZone.getAvailableIDs();
    } else {
        tzids = TimeZone.getAvailableIDs();
    }
    int[] inOffsets = new int[2];
    int[] outOffsets = new int[2];
    // Run the roundtrip test
    for (int locidx = 0; locidx < LOCALES.length; locidx++) {
        logln("Locale: " + LOCALES[locidx].toString());
        String localGMTString = TimeZoneFormat.getInstance(LOCALES[locidx]).formatOffsetLocalizedGMT(0);
        for (int patidx = 0; patidx < PATTERNS.length; patidx++) {
            logln("    pattern: " + PATTERNS[patidx]);
            SimpleDateFormat sdf = new SimpleDateFormat(PATTERNS[patidx], LOCALES[locidx]);
            for (int tzidx = 0; tzidx < tzids.length; tzidx++) {
                if (EXCL_TZ_PATTERN.matcher(tzids[tzidx]).matches()) {
                    continue;
                }
                TimeZone tz = TimeZone.getTimeZone(tzids[tzidx]);
                for (int datidx = 0; datidx < DATES.length; datidx++) {
                    // Format
                    sdf.setTimeZone(tz);
                    String tzstr = sdf.format(DATES[datidx]);
                    // Before parse, set unknown zone to SimpleDateFormat instance
                    // just for making sure that it does not depends on the time zone
                    // originally set.
                    sdf.setTimeZone(unknownZone);
                    // Parse
                    ParsePosition pos = new ParsePosition(0);
                    Calendar outcal = Calendar.getInstance(unknownZone);
                    outcal.set(Calendar.DST_OFFSET, badDstOffset);
                    outcal.set(Calendar.ZONE_OFFSET, badZoneOffset);
                    sdf.parse(tzstr, outcal, pos);
                    // Check the result
                    TimeZone outtz = outcal.getTimeZone();
                    tz.getOffset(DATES[datidx].getTime(), false, inOffsets);
                    outtz.getOffset(DATES[datidx].getTime(), false, outOffsets);
                    if (PATTERNS[patidx].equals("V")) {
                        // Short zone ID - should support roundtrip for canonical CLDR IDs
                        String canonicalID = TimeZone.getCanonicalID(tzids[tzidx]);
                        if (!outtz.getID().equals(canonicalID)) {
                            if (outtz.getID().equals("Etc/Unknown")) {
                                // short zone ID and "unk" is used as the fallback
                                if (REALLY_VERBOSE_LOG) {
                                    logln("Canonical round trip failed (probably as expected); tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", outtz=" + outtz.getID());
                                }
                            } else {
                                errln("Canonical round trip failed; tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", outtz=" + outtz.getID());
                            }
                        }
                    } else if (PATTERNS[patidx].equals("VV")) {
                        // Zone ID - full roundtrip support
                        if (!outtz.getID().equals(tzids[tzidx])) {
                            errln("Zone ID round trip failed; tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", outtz=" + outtz.getID());
                        }
                    } else if (PATTERNS[patidx].equals("VVV") || PATTERNS[patidx].equals("VVVV")) {
                        // Location: time zone rule must be preserved except
                        // zones not actually associated with a specific location.
                        String canonicalID = TimeZone.getCanonicalID(tzids[tzidx]);
                        if (canonicalID != null && !outtz.getID().equals(canonicalID)) {
                            // Canonical ID did not match - check the rules
                            boolean bFailure = false;
                            if ((tz instanceof BasicTimeZone) && (outtz instanceof BasicTimeZone)) {
                                boolean hasNoLocation = TimeZone.getRegion(tzids[tzidx]).equals("001");
                                bFailure = !hasNoLocation && !((BasicTimeZone) outtz).hasEquivalentTransitions(tz, low, high);
                            }
                            if (bFailure) {
                                errln("Canonical round trip failed; tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", outtz=" + outtz.getID());
                            } else if (REALLY_VERBOSE_LOG) {
                                logln("Canonical round trip failed (as expected); tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", outtz=" + outtz.getID());
                            }
                        }
                    } else {
                        boolean isOffsetFormat = (PATTERNS[patidx].charAt(0) == 'Z' || PATTERNS[patidx].charAt(0) == 'O' || PATTERNS[patidx].charAt(0) == 'X' || PATTERNS[patidx].charAt(0) == 'x');
                        boolean minutesOffset = false;
                        if (PATTERNS[patidx].charAt(0) == 'X' || PATTERNS[patidx].charAt(0) == 'x') {
                            minutesOffset = PATTERNS[patidx].length() <= 3;
                        }
                        if (!isOffsetFormat) {
                            // Check if localized GMT format is used as a fallback of name styles
                            int numDigits = 0;
                            for (int n = 0; n < tzstr.length(); n++) {
                                if (UCharacter.isDigit(tzstr.charAt(n))) {
                                    numDigits++;
                                }
                            }
                            isOffsetFormat = (numDigits > 0);
                        }
                        if (isOffsetFormat || tzstr.equals(localGMTString)) {
                            // Localized GMT or ISO: total offset (raw + dst) must be preserved.
                            int inOffset = inOffsets[0] + inOffsets[1];
                            int outOffset = outOffsets[0] + outOffsets[1];
                            int diff = outOffset - inOffset;
                            if (minutesOffset) {
                                diff = (diff / 60000) * 60000;
                            }
                            if (diff != 0) {
                                errln("Offset round trip failed; tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", inOffset=" + inOffset + ", outOffset=" + outOffset);
                            }
                        } else {
                            // Specific or generic: raw offset must be preserved.
                            if (inOffsets[0] != outOffsets[0]) {
                                if (JDKTZ && tzids[tzidx].startsWith("SystemV/")) {
                                    // ICU handles these zones as aliases of existing time zones
                                    if (REALLY_VERBOSE_LOG) {
                                        logln("Raw offset round trip failed; tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", inRawOffset=" + inOffsets[0] + ", outRawOffset=" + outOffsets[0]);
                                    }
                                } else {
                                    errln("Raw offset round trip failed; tz=" + tzids[tzidx] + ", locale=" + LOCALES[locidx] + ", pattern=" + PATTERNS[patidx] + ", time=" + DATES[datidx].getTime() + ", str=" + tzstr + ", inRawOffset=" + inOffsets[0] + ", outRawOffset=" + outOffsets[0]);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
Also used : ULocale(android.icu.util.ULocale) Calendar(android.icu.util.Calendar) Date(java.util.Date) SimpleTimeZone(android.icu.util.SimpleTimeZone) TimeZone(android.icu.util.TimeZone) BasicTimeZone(android.icu.util.BasicTimeZone) BasicTimeZone(android.icu.util.BasicTimeZone) SimpleTimeZone(android.icu.util.SimpleTimeZone) SimpleDateFormat(android.icu.text.SimpleDateFormat) ParsePosition(java.text.ParsePosition) Test(org.junit.Test)

Example 64 with TimeZone

use of android.icu.util.TimeZone in project android_frameworks_opt_telephony by LineageOS.

the class TimeZoneLookupHelperTest method assertOffsetResultZoneOffsets.

/**
 * Assert the time zone in the OffsetResult has the expected properties at the specified time.
 */
private static void assertOffsetResultZoneOffsets(long time, int expectedOffsetAtTime, Integer expectedDstAtTime, OffsetResult lookupResult) {
    TimeZone timeZone = lookupResult.getTimeZone();
    GregorianCalendar calendar = new GregorianCalendar(timeZone);
    calendar.setTimeInMillis(time);
    int actualOffsetAtTime = calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET);
    assertEquals(expectedOffsetAtTime, actualOffsetAtTime);
    if (expectedDstAtTime != null) {
        Date date = new Date(time);
        assertEquals(expectedDstAtTime > 0, timeZone.inDaylightTime(date));
        // The code under test assumes DST means +1 in all cases,
        // This code makes fewer assumptions.
        assertEquals(expectedDstAtTime.intValue(), calendar.get(Calendar.DST_OFFSET));
    }
}
Also used : TimeZone(android.icu.util.TimeZone) GregorianCalendar(android.icu.util.GregorianCalendar) Date(java.util.Date)

Example 65 with TimeZone

use of android.icu.util.TimeZone in project android_frameworks_opt_telephony by LineageOS.

the class TimeZoneLookupHelper method lookupByInstantOffsetDst.

private static OffsetResult lookupByInstantOffsetDst(long timeMillis, int utcOffsetMillis, @Nullable Boolean isDst) {
    String[] zones = TimeZone.getAvailableIDs();
    TimeZone match = null;
    boolean isOnlyMatch = true;
    for (String zone : zones) {
        TimeZone tz = TimeZone.getFrozenTimeZone(zone);
        if (offsetMatchesAtTime(tz, utcOffsetMillis, isDst, timeMillis)) {
            if (match == null) {
                match = tz;
            } else {
                isOnlyMatch = false;
                break;
            }
        }
    }
    if (match == null) {
        return null;
    }
    return new OffsetResult(match, isOnlyMatch);
}
Also used : TimeZone(android.icu.util.TimeZone) OffsetResult(android.timezone.CountryTimeZones.OffsetResult)

Aggregations

TimeZone (android.icu.util.TimeZone)125 Test (org.junit.Test)98 SimpleTimeZone (android.icu.util.SimpleTimeZone)76 Date (java.util.Date)63 GregorianCalendar (android.icu.util.GregorianCalendar)49 Calendar (android.icu.util.Calendar)42 BasicTimeZone (android.icu.util.BasicTimeZone)41 SimpleDateFormat (android.icu.text.SimpleDateFormat)36 ULocale (android.icu.util.ULocale)31 RuleBasedTimeZone (android.icu.util.RuleBasedTimeZone)24 VTimeZone (android.icu.util.VTimeZone)23 DateFormat (android.icu.text.DateFormat)19 JavaTimeZone (android.icu.impl.JavaTimeZone)18 NativeTimeZone (com.google.j2objc.util.NativeTimeZone)18 JapaneseCalendar (android.icu.util.JapaneseCalendar)15 FieldPosition (java.text.FieldPosition)15 BuddhistCalendar (android.icu.util.BuddhistCalendar)13 ParsePosition (java.text.ParsePosition)13 ChineseCalendar (android.icu.util.ChineseCalendar)12 ParseException (java.text.ParseException)12