Java Code Examples for java.util.TimeZone#getRawOffset()

The following examples show how to use java.util.TimeZone#getRawOffset() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: TimeZoneWrapper.java    From opentasks with Apache License 2.0 6 votes vote down vote up
@Override
public boolean equals(Object object)
{
    if (!(object instanceof TimeZoneWrapper)) // matches null too
    {
        return false;
    }

    TimeZone otherTimeZone = (TimeZone) object;

    /*
     * This is a very simple check for equality of two time zones. It returns the wrong result if two time zones have the same UTC offset, but use different
     * dates to switch to summer time.
     *
     * Are there such cases? How can we improve it? Maybe by testing a few more days in March and October?
     *
     * TODO: improve the check
     */
    return (mTimeZone.getID().equals(otherTimeZone.getID()))
            || (mTimeZone.useDaylightTime() == otherTimeZone.useDaylightTime() && mTimeZone.getRawOffset() == otherTimeZone.getRawOffset()
            && mTimeZone.getDSTSavings() == otherTimeZone.getDSTSavings() && mTimeZone.inDaylightTime(TEST_DATE) == otherTimeZone.inDaylightTime(
            TEST_DATE));
}
 
Example 2
Source File: ZoneInfoOld.java    From openjdk-jdk8u with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Returns true if this zone has the same raw GMT offset value and
 * transition table as another zone info. If the specified
 * TimeZone object is not a ZoneInfoOld instance, this method returns
 * true if the specified TimeZone object has the same raw GMT
 * offset value with no daylight saving time.
 *
 * @param other the ZoneInfoOld object to be compared with
 * @return true if the given <code>TimeZone</code> has the same
 * GMT offset and transition information; false, otherwise.
 */
public boolean hasSameRules(TimeZone other) {
    if (this == other) {
        return true;
    }
    if (other == null) {
        return false;
    }
    if (!(other instanceof ZoneInfoOld)) {
        if (getRawOffset() != other.getRawOffset()) {
            return false;
        }
        // if both have the same raw offset and neither observes
        // DST, they have the same rule.
        if ((transitions == null)
            && (useDaylightTime() == false)
            && (other.useDaylightTime() == false)) {
            return true;
        }
        return false;
    }
    if (getLastRawOffset() != ((ZoneInfoOld)other).getLastRawOffset()) {
        return false;
    }
    return (checksum == ((ZoneInfoOld)other).checksum);
}
 
Example 3
Source File: TimeZonesAdapter.java    From Alarmio with Apache License 2.0 6 votes vote down vote up
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
    TimeZone timeZone = TimeZone.getTimeZone(timeZones.get(position));

    int offsetMillis = timeZone.getRawOffset();
    holder.time.setText(String.format(
            Locale.getDefault(),
            "GMT%s%02d:%02d",
            offsetMillis >= 0 ? "+" : "",
            TimeUnit.MILLISECONDS.toHours(offsetMillis),
            TimeUnit.MILLISECONDS.toMinutes(Math.abs(offsetMillis)) % TimeUnit.HOURS.toMinutes(1)
    ));

    holder.title.setText(timeZone.getDisplayName(Locale.getDefault()));

    holder.itemView.setOnClickListener(v -> holder.checkBox.toggle());

    holder.checkBox.setOnCheckedChangeListener(null);
    holder.checkBox.setChecked((boolean) PreferenceData.TIME_ZONE_ENABLED.getSpecificValue(holder.itemView.getContext(), timeZone.getID()));
    holder.checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
        TimeZone timeZone1 = TimeZone.getTimeZone(timeZones.get(holder.getAdapterPosition()));
        PreferenceData.TIME_ZONE_ENABLED.setValue(holder.itemView.getContext(), isChecked, timeZone1.getID());
    });
}
 
Example 4
Source File: ZoneInfo.java    From Bytecoder with Apache License 2.0 6 votes vote down vote up
/**
 * Returns true if this zone has the same raw GMT offset value and
 * transition table as another zone info. If the specified
 * TimeZone object is not a ZoneInfo instance, this method returns
 * true if the specified TimeZone object has the same raw GMT
 * offset value with no daylight saving time.
 *
 * @param other the ZoneInfo object to be compared with
 * @return true if the given <code>TimeZone</code> has the same
 * GMT offset and transition information; false, otherwise.
 */
public boolean hasSameRules(TimeZone other) {
    if (this == other) {
        return true;
    }
    if (other == null) {
        return false;
    }
    if (!(other instanceof ZoneInfo)) {
        if (getRawOffset() != other.getRawOffset()) {
            return false;
        }
        // if both have the same raw offset and neither observes
        // DST, they have the same rule.
        if ((transitions == null)
            && (useDaylightTime() == false)
            && (other.useDaylightTime() == false)) {
            return true;
        }
        return false;
    }
    if (getLastRawOffset() != ((ZoneInfo)other).getLastRawOffset()) {
        return false;
    }
    return (checksum == ((ZoneInfo)other).checksum);
}
 
Example 5
Source File: TimeZoneNameProviderImpl.java    From openjdk-jdk9 with GNU General Public License v2.0 6 votes vote down vote up
private String[] getDisplayNameArray(String id, Locale locale) {
    Objects.requireNonNull(id);
    Objects.requireNonNull(locale);

    String[] ret =
        LocaleProviderAdapter.forType(type).getLocaleResources(locale).getTimeZoneNames(id);

    if (Objects.nonNull(ret) && type == LocaleProviderAdapter.Type.CLDR) {
        // check for CLDR's "no inheritance marker"
        for (int index = 0; index < ret.length; index++) {
            TimeZone tz = null;
            if (CLDR_NO_INHERITANCE_MARKER.equals(ret[index])) {
                if (Objects.isNull(tz)) {
                    tz = TimeZone.getTimeZone(id);
                }
                int offset = tz.getRawOffset();
                if (index == 3 || index == 4) { // daylight
                    offset += tz.getDSTSavings();
                }
                ret[index] = ZoneInfoFile.toCustomID(offset);
            }
        }
    }

    return ret;
}
 
Example 6
Source File: TimeZoneTest.java    From j2objc with Apache License 2.0 6 votes vote down vote up
public void test_getAvailableIDs_I_16947622() {
    TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
    int rawOffset = tz.getRawOffset();
    assertEquals(-8 * 60 * 60 * 1000, rawOffset);
    List<String> ids = Arrays.asList(TimeZone.getAvailableIDs(rawOffset));
    
    // Obviously, for all time zones, the time zone whose raw offset we started with
    // should be one of the available ids for that offset.
    assertTrue(ids.toString(), ids.contains("America/Los_Angeles"));

    // Any one of these might legitimately change its raw offset, though that's
    // fairly unlikely, and the chances of more than one changing are very slim.
    assertTrue(ids.toString(), ids.contains("America/Santa_Isabel"));
    assertTrue(ids.toString(), ids.contains("America/Tijuana"));
    assertTrue(ids.toString(), ids.contains("America/Vancouver"));
    // j2objc: NSTimeZone does not list Canada/* as known time zone names.
    // assertTrue(ids.toString(), ids.contains("Canada/Pacific"));
    // assertTrue(ids.toString(), ids.contains("Canada/Yukon"));
    assertTrue(ids.toString(), ids.contains("Pacific/Pitcairn"));
}
 
Example 7
Source File: ZoneInfoOld.java    From hottub with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Returns true if this zone has the same raw GMT offset value and
 * transition table as another zone info. If the specified
 * TimeZone object is not a ZoneInfoOld instance, this method returns
 * true if the specified TimeZone object has the same raw GMT
 * offset value with no daylight saving time.
 *
 * @param other the ZoneInfoOld object to be compared with
 * @return true if the given <code>TimeZone</code> has the same
 * GMT offset and transition information; false, otherwise.
 */
public boolean hasSameRules(TimeZone other) {
    if (this == other) {
        return true;
    }
    if (other == null) {
        return false;
    }
    if (!(other instanceof ZoneInfoOld)) {
        if (getRawOffset() != other.getRawOffset()) {
            return false;
        }
        // if both have the same raw offset and neither observes
        // DST, they have the same rule.
        if ((transitions == null)
            && (useDaylightTime() == false)
            && (other.useDaylightTime() == false)) {
            return true;
        }
        return false;
    }
    if (getLastRawOffset() != ((ZoneInfoOld)other).getLastRawOffset()) {
        return false;
    }
    return (checksum == ((ZoneInfoOld)other).checksum);
}
 
Example 8
Source File: CLDRTimeZoneNameProviderImpl.java    From Bytecoder with Apache License 2.0 6 votes vote down vote up
private String toGMTFormat(String id, boolean daylight, boolean isShort, Locale l) {
    TimeZone tz = ZoneInfoFile.getZoneInfo(id);
    int offset = (tz.getRawOffset() + (daylight ? tz.getDSTSavings() : 0)) / 60000;
    LocaleResources lr = LocaleProviderAdapter.forType(Type.CLDR).getLocaleResources(l);
    ResourceBundle fd = lr.getJavaTimeFormatData();

    if (offset == 0) {
        return fd.getString("timezone.gmtZeroFormat");
    } else {
        String gmtFormat = fd.getString("timezone.gmtFormat");
        String hourFormat = fd.getString("timezone.hourFormat");

        if (offset > 0) {
            hourFormat = hourFormat.substring(0, hourFormat.indexOf(";"));
        } else {
            hourFormat = hourFormat.substring(hourFormat.indexOf(";") + 1);
            offset = -offset;
        }
        hourFormat = hourFormat
            .replaceFirst("H+", (isShort ? "\\%1\\$d" : "\\%1\\$02d"))
            .replaceFirst("m+", "\\%2\\$02d");
        return MessageFormat.format(gmtFormat,
                String.format(l, hourFormat, offset / 60, offset % 60));
    }
}
 
Example 9
Source File: ASN1GeneralizedTime.java    From RipplePower with Apache License 2.0 5 votes vote down vote up
private String calculateGMTOffset()
{
    String sign = "+";
    TimeZone timeZone = TimeZone.getDefault();
    int offset = timeZone.getRawOffset();
    if (offset < 0)
    {
        sign = "-";
        offset = -offset;
    }
    int hours = offset / (60 * 60 * 1000);
    int minutes = (offset - (hours * 60 * 60 * 1000)) / (60 * 1000);

    try
    {
        if (timeZone.useDaylightTime() && timeZone.inDaylightTime(this.getDate()))
        {
            hours += sign.equals("+") ? 1 : -1;
        }
    }
    catch (ParseException e)
    {
        // we'll do our best and ignore daylight savings
    }

    return "GMT" + sign + convert(hours) + ":" + convert(minutes);
}
 
Example 10
Source File: DERGeneralizedTime.java    From TorrentEngine with GNU General Public License v3.0 5 votes vote down vote up
private String calculateGMTOffset()
{
    String sign = "+";
    TimeZone timeZone = TimeZone.getDefault();
    int offset = timeZone.getRawOffset();
    if (offset < 0)
    {
        sign = "-";
        offset = -offset;
    }
    int hours = offset / (60 * 60 * 1000);
    int minutes = (offset - (hours * 60 * 60 * 1000)) / (60 * 1000);

    try
    {
        if (timeZone.useDaylightTime() && timeZone.inDaylightTime(this.getDate()))
        {
            hours += sign.equals("+") ? 1 : -1;
        }
    }
    catch (ParseException e)
    {
        // we'll do our best and ignore daylight savings
    }

    return "GMT" + sign + convert(hours) + ":" + convert(minutes);
}
 
Example 11
Source File: DateUtils.java    From wechat-pay-sdk with MIT License 5 votes vote down vote up
/**
 * 日期类型转字符串, 带时区转换
 * @param dateFormat  格式化格式, eg: yyyy-MM-dd, yyyy-MM-dd HH:mm:ss
 * @return
 */
public static String convertDate2String(Date sourceDate, String dateFormat, TimeZone sourceTimeZone,
                                        TimeZone targetTimeZone) {

    if(null == sourceDate) {
        return "";
    }

    Long targetTime = sourceDate.getTime() - sourceTimeZone.getRawOffset() + targetTimeZone.getRawOffset();
    return convertDate2String(new Date(targetTime), dateFormat);
}
 
Example 12
Source File: getTimeZoneInfo.java    From openbd-core with GNU General Public License v3.0 5 votes vote down vote up
public cfData execute(cfSession _session, List<cfData> parameters) throws cfmRunTimeException {
	cfStructData timeInfo = new cfStructData();
	TimeZone tz = (TimeZone) TimeZone.getDefault().clone();
	int dstCompensation = 0;

	boolean dst = tz.inDaylightTime(new Date());

	if (dst)
		dstCompensation = tz.getDSTSavings(); // the # of milliseconds in an hour.

	long offset = tz.getRawOffset() + dstCompensation;

	offset = offset * -1; // cfmx livedocs for this function mandate that the
												// sign be this way (which happens to be opposite of
												// what Java does)

	long totalOffSet = offset / 1000L;
	long hour = offset / (1000L * 60L * 60L);
	long minutes = offset / (1000L * 60L);
	long partialHourAsMinutes = minutes % 60; // to remove all whole hours

	timeInfo.setData("utctotaloffset", new cfNumberData(totalOffSet));
	timeInfo.setData("utchouroffset", new cfNumberData(hour));
	timeInfo.setData("utcminuteoffset", new cfNumberData(partialHourAsMinutes));
	timeInfo.setData("isdston", cfBooleanData.getcfBooleanData(dst));

	return timeInfo;
}
 
Example 13
Source File: TestImmutableTimestamp.java    From reladomo with Apache License 2.0 5 votes vote down vote up
protected static int getOffsetFromTimeZone(TimeZone tz, Date date)
{
    int offset = tz.getRawOffset();
    if (tz.inDaylightTime(date))
    {
        offset += tz.getDSTSavings();
    }
    return offset;
}
 
Example 14
Source File: DatatypeConverter.java    From AndroidHttpCapture with MIT License 5 votes vote down vote up
/** formats time zone specifier. */
private static void formatTimeZone(Calendar cal,StringBuilder buf) {
    TimeZone tz = cal.getTimeZone();

    if (tz == null)      return;

    // otherwise print out normally.
    int offset;
    if (tz.inDaylightTime(cal.getTime())) {
        offset = tz.getRawOffset() + (tz.useDaylightTime()?3600000:0);
    } else {
        offset = tz.getRawOffset();
    }

    if(offset==0) {
        buf.append('Z');
        return;
    }

    if (offset >= 0)
        buf.append('+');
    else {
        buf.append('-');
        offset *= -1;
    }

    offset /= 60 * 1000; // offset is in milli-seconds

    formatTwoDigits(offset / 60, buf);
    buf.append(':');
    formatTwoDigits(offset % 60, buf);
}
 
Example 15
Source File: DateCache.java    From IoTgo_Android_App with MIT License 5 votes vote down vote up
private synchronized void setTzFormatString(final  TimeZone tz )
{
    int zIndex = _formatString.indexOf( "ZZZ" );
    if( zIndex >= 0 )
    {
        String ss1 = _formatString.substring( 0, zIndex );
        String ss2 = _formatString.substring( zIndex+3 );
        int tzOffset = tz.getRawOffset();
        
        StringBuilder sb = new StringBuilder(_formatString.length()+10);
        sb.append(ss1);
        sb.append("'");
        if( tzOffset >= 0 )
            sb.append( '+' );
        else
        {
            tzOffset = -tzOffset;
            sb.append( '-' );
        }
        
        int raw = tzOffset / (1000*60);		// Convert to seconds
        int hr = raw / 60;
        int min = raw % 60;
        
        if( hr < 10 )
            sb.append( '0' );
        sb.append( hr );
        if( min < 10 )
            sb.append( '0' );
        sb.append( min );
        sb.append( '\'' );
        
        sb.append(ss2);
        _tzFormatString=sb.toString();            
    }
    else
        _tzFormatString=_formatString;
    setMinFormatString();
}
 
Example 16
Source File: AbstractCalendar.java    From hottub with GNU General Public License v2.0 4 votes vote down vote up
public CalendarDate getCalendarDate(long millis, CalendarDate date) {
    int ms = 0;             // time of day
    int zoneOffset = 0;
    int saving = 0;
    long days = 0;          // fixed date

    // adjust to local time if `date' has time zone.
    TimeZone zi = date.getZone();
    if (zi != null) {
        int[] offsets = new int[2];
        if (zi instanceof ZoneInfo) {
            zoneOffset = ((ZoneInfo)zi).getOffsets(millis, offsets);
        } else {
            zoneOffset = zi.getOffset(millis);
            offsets[0] = zi.getRawOffset();
            offsets[1] = zoneOffset - offsets[0];
        }

        // We need to calculate the given millis and time zone
        // offset separately for java.util.GregorianCalendar
        // compatibility. (i.e., millis + zoneOffset could cause
        // overflow or underflow, which must be avoided.) Usually
        // days should be 0 and ms is in the range of -13:00 to
        // +14:00. However, we need to deal with extreme cases.
        days = zoneOffset / DAY_IN_MILLIS;
        ms = zoneOffset % DAY_IN_MILLIS;
        saving = offsets[1];
    }
    date.setZoneOffset(zoneOffset);
    date.setDaylightSaving(saving);

    days += millis / DAY_IN_MILLIS;
    ms += (int) (millis % DAY_IN_MILLIS);
    if (ms >= DAY_IN_MILLIS) {
        // at most ms is (DAY_IN_MILLIS - 1) * 2.
        ms -= DAY_IN_MILLIS;
        ++days;
    } else {
        // at most ms is (1 - DAY_IN_MILLIS) * 2. Adding one
        // DAY_IN_MILLIS results in still negative.
        while (ms < 0) {
            ms += DAY_IN_MILLIS;
            --days;
        }
    }

    // convert to fixed date (offset from Jan. 1, 1 (Gregorian))
    days += EPOCH_OFFSET;

    // calculate date fields from the fixed date
    getCalendarDateFromFixedDate(date, days);

    // calculate time fields from the time of day
    setTimeOfDay(date, ms);
    date.setLeapYear(isLeapYear(date));
    date.setNormalized(true);
    return date;
}
 
Example 17
Source File: Util.java    From calcite with Apache License 2.0 4 votes vote down vote up
/**
 * Writes a daylight savings time transition to a POSIX timezone
 * description.
 *
 * @param tz        Timezone
 * @param buf       Buffer to append to
 * @param mode      Transition mode
 * @param day       Day of transition
 * @param month     Month of transition
 * @param dayOfWeek Day of week of transition
 * @param time      Time of transition in millis
 * @param timeMode  Mode of time transition
 * @param verbose   Verbose
 * @param isEnd     Whether this transition is leaving DST
 */
private static void appendPosixDaylightTransition(
    TimeZone tz,
    StringBuilder buf,
    int mode,
    int day,
    int month,
    int dayOfWeek,
    int time,
    int timeMode,
    boolean verbose,
    boolean isEnd) {
  buf.append(',');
  int week = day;
  switch (mode) {
  case 1: // SimpleTimeZone.DOM_MODE
    throw Util.needToImplement(0);

  case 3: // SimpleTimeZone.DOW_GE_DOM_MODE

    // If the day is 1, 8, 15, 22, we can translate this to case 2.
    switch (day) {
    case 1:
      week = 1; // 1st week of month
      break;
    case 8:
      week = 2; // 2nd week of month
      break;
    case 15:
      week = 3; // 3rd week of month
      break;
    case 22:
      week = 4; // 4th week of month
      break;
    default:
      throw new AssertionError(
          "POSIX timezone format cannot represent " + tz);
    }
    // fall through

  case 2: // SimpleTimeZone.DOW_IN_MONTH_MODE
    buf.append('M');
    buf.append(month + 1); // 1 <= m <= 12
    buf.append('.');
    if (week == -1) {
      // java represents 'last week' differently from POSIX
      week = 5;
    }
    buf.append(week); // 1 <= n <= 5, 5 means 'last'
    buf.append('.');
    buf.append(dayOfWeek - 1); // 0 <= d <= 6, 0=Sunday
    break;

  case 4: // SimpleTimeZone.DOW_LE_DOM_MODE
    throw Util.needToImplement(0);
  default:
    throw new AssertionError("unexpected value: " + mode);
  }
  switch (timeMode) {
  case 0: // SimpleTimeZone.WALL_TIME
    break;
  case 1: // SimpleTimeZone.STANDARD_TIME, e.g. Australia/Sydney
    if (isEnd) {
      time += tz.getDSTSavings();
    }
    break;
  case 2: // SimpleTimeZone.UTC_TIME, e.g. Europe/Paris
    time += tz.getRawOffset();
    if (isEnd) {
      time += tz.getDSTSavings();
    }
    break;
  }
  if (verbose || (time != 7200000)) {
    // POSIX allows us to omit the time if it is 2am (the default)
    buf.append('/');
    appendPosixTime(buf, time);
  }
}
 
Example 18
Source File: GXDateTime.java    From gurux.dlms.java with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Convert deviation to time zone.
 * 
 * @param deviation
 *            Used deviation.
 * @param dst
 *            Is daylight saving time used.
 * @return Time zone.
 */
public static TimeZone getTimeZone(final int deviation, final boolean dst) {
    // Return current time zone if time zone is not used.
    if (deviation == 0x8000 || deviation == -32768) {
        return Calendar.getInstance().getTimeZone();
    }
    TimeZone tz = Calendar.getInstance().getTimeZone();
    if (dst) {
        // If meter is in same time zone than meter reading application.
        if (tz.observesDaylightTime()
                && tz.getRawOffset() / 60000 == deviation - 60) {
            return tz;
        }
        String[] ids = TimeZone.getAvailableIDs((deviation - 60) * 60000);
        tz = null;
        for (int pos = 0; pos != ids.length; ++pos) {
            tz = TimeZone.getTimeZone(ids[pos]);
            if (tz.observesDaylightTime()
                    && tz.getRawOffset() / 60000 == deviation - 60) {
                break;
            }
            tz = null;
        }
        if (tz != null) {
            return tz;
        }
    }
    if (tz != null && !tz.observesDaylightTime()
            && tz.getRawOffset() / 60000 == deviation) {
        return tz;
    }
    String str;
    DecimalFormat df = new DecimalFormat("00");
    String tmp = df.format(deviation / 60) + ":"
            + df.format(Math.abs(deviation) % 60);
    if (deviation == 0) {
        str = "GMT";
    } else if (deviation > 0) {
        str = "GMT+" + tmp;
    } else {
        str = "GMT" + tmp;
    }
    return TimeZone.getTimeZone(str);
}
 
Example 19
Source File: ZoneInfoOld.java    From openjdk-jdk8u-backup with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Gets all available IDs that have the same value as the
 * specified raw GMT offset.
 *
 * @param rawOffset the GMT offset in milliseconds. This
 * value should not include any daylight saving time.
 *
 * @return an array of time zone IDs.
 */
public static String[] getAvailableIDs(int rawOffset) {
    String[] result;
    List<String> matched = new ArrayList<>();
    List<String> IDs = ZoneInfoFile.getZoneIDs();
    int[] rawOffsets = ZoneInfoFile.getRawOffsets();

loop:
    for (int index = 0; index < rawOffsets.length; index++) {
        if (rawOffsets[index] == rawOffset) {
            byte[] indices = ZoneInfoFile.getRawOffsetIndices();
            for (int i = 0; i < indices.length; i++) {
                if (indices[i] == index) {
                    matched.add(IDs.get(i++));
                    while (i < indices.length && indices[i] == index) {
                        matched.add(IDs.get(i++));
                    }
                    break loop;
                }
            }
        }
    }

    // We need to add any zones from the excluded zone list that
    // currently have the same GMT offset as the specified
    // rawOffset. The zones returned by this method may not be
    // correct as of return to the caller if any GMT offset
    // transition is happening during this GMT offset checking...
    List<String> excluded = ZoneInfoFile.getExcludedZones();
    if (excluded != null) {
        for (String id : excluded) {
            TimeZone zi = getTimeZone(id);
            if (zi != null && zi.getRawOffset() == rawOffset) {
                matched.add(id);
            }
        }
    }

    result = new String[matched.size()];
    matched.toArray(result);
    return result;
}
 
Example 20
Source File: Main.java    From Java-Coding-Problems with MIT License 4 votes vote down vote up
public static void main(String[] args) {

        System.out.println("Before JDK 8:");
        TimeZone timeZoneAP = TimeZone.getTimeZone("Australia/Perth");
        int offsetFromTimeZone = timeZoneAP.getRawOffset();
        String userFriendlyOffsetTimeZone = formatOffset(offsetFromTimeZone);
        System.out.println("Offset from TimeZone (Australia/Perth): " + userFriendlyOffsetTimeZone);

        Calendar calendar = Calendar.getInstance();
        // Summer time in Bucharest: 
        // Sunday, 31 March 2019, 1h forward -  Sunday, 27 October 2019, 1 hour backward
        // month 6 is a summer month in Bucharest, so you will get +03:00
        // month 11 is a winter month in Bucharest, so you will get +02:00
        calendar.set(2019, 11, 15);
        TimeZone timeZoneEB = TimeZone.getTimeZone("Europe/Bucharest");
        timeZoneEB.useDaylightTime();
        int offsetFromDate = timeZoneEB.getOffset(calendar.getTime().getTime());
        String userFriendlyOffsetDate = formatOffset(offsetFromDate);
        System.out.println("Offset from Calendar (Europe/Bucharest): " + userFriendlyOffsetDate);

        // JDK 8
        System.out.println("\n\nStarting with JDK 8:");
        // returns Z, which is +00:00
        ZoneOffset zoneOffsetUTC = ZoneOffset.UTC;
        System.out.println("ZoneOffset UTC: " + zoneOffsetUTC);
        // getting the system default time zone
        ZoneId defaultZoneId = ZoneOffset.systemDefault();
        System.out.println("Default zone id: " + defaultZoneId);

        // by default it deals with the Daylight Saving Times
        LocalDateTime ldt = LocalDateTime.of(2019, 3, 15, 0, 0);
        ZoneId zoneId = ZoneId.of("Europe/Bucharest");
        ZoneOffset zoneOffset = zoneId.getRules().getOffset(ldt);
        System.out.println("\nZoneOffset from LocalDateTime (Europe/Bucharest): " + zoneOffset);

        ZoneOffset zoneOffsetFromString = ZoneOffset.of("+02:00");
        System.out.println("\nZoneOffset from String: " + zoneOffsetFromString);
        // for example, use it to define an OffsetDateTime or an OffsetTime        
        OffsetTime offsetTime = OffsetTime.now(zoneOffsetFromString);
        OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffsetFromString);
        System.out.println("OffsetTime from ZoneOffset of current date: " + offsetTime);
        System.out.println("OffsetDateTime from ZoneOffset of current date: " + offsetDateTime);

        ZoneOffset zoneOffsetFromHoursMinutes = ZoneOffset.ofHoursMinutes(8, 30);
        System.out.println("\nZoneOffset from hours and minutes: " + zoneOffsetFromHoursMinutes);

        ZoneOffset zoneOffsetFromOdt = offsetDateTime.getOffset();
        System.out.println("ZoneOffset from OffsetDateTime: " + zoneOffsetFromOdt);
    }