将 DateTime 转换为时区,设置时间并转换回来

Convert DateTime to timezone, set time and convert back

我有一个小的实用方法,可以将 DateTime 转换为特定的 DateTimeZone,设置该时区的时间并再次转换为另一个时区:

/**
 * Delivers a DateTime with changed time in the specified DateTimeZone.
 *
 * @param  dateTime      the date time to convert
 * @param  hour          the hour to set in the client timezone date time
 * @param  minute        the minute to set in the client timezone date time
 * @param  second        the second to set in the client timezone date time
 * @param  dtzConversion the client time zone
 * @param  dtzReturn     the time zone of the return date time (optionally: can be null)
 * @return the date time
 */
public DateTime convertDateTimeToTimeZone(final DateTime dateTime, final int hour, final int minute, final int second,
                                          final DateTimeZone dtzConversion, final DateTimeZone dtzReturn)
{
    // convert to given timezone        
    DateTime dtClientTimezone = dateTime.withZoneRetainFields(dtzConversion);
    // adjust time
    dtClientTimezone = dtClientTimezone.withTime(hour, minute, second, 0);

    if (dtzReturn != null) {
        // convert to target timezone
        dtClientTimezone = dtClientTimezone.withZoneRetainFields(dtzReturn);
    }

    return dtClientTimezone;
}

在我的示例中,dateTime 是德国日期 30.9.2015 22:00:00 UTCdtzConversionEurope/BerlindtzReturnUTC,需要设置时间12:00:00 结果是 2015 年 9 月 30 日 12:00:00。但我希望 01.10.2015 10:00:00 因为 30.09.2015 22:00:00 UTCEurope/Berlin 应该是 01.10.2015 00:00:00。时间设置为“12:00:00”,结果为 01.10.2015 12:00:00。这在 UTC 中是 01.10.2015 10:00:00。我的错在哪里?

方法withZoneRetainFields 不转换字段值。相反,它只是更改时区(以及基础毫秒数,以便字段在新时区中的值与旧时区中的值相同)。

您搜索的方法是withZone,调整字段:

public static DateTime convertDateTimeToTimeZone(final DateTime dateTime, final int hour, final int minute,
        final int second,
        final DateTimeZone dtzConversion, final DateTimeZone dtzReturn)
{
    // convert to given timezone        
    DateTime dtClientTimezone = dateTime.withZone(dtzConversion);
    // adjust time
    dtClientTimezone = dtClientTimezone.withTime(hour, minute, second, 0);

    if (dtzReturn != null) {
        // convert to target timezone
        dtClientTimezone = dtClientTimezone.withZone(dtzReturn);
    }

    return dtClientTimezone;
}

public static void main(String[] args)
{
    DateTime parse = DateTime.parse("2015-09-30T22:00:00Z");
    DateTime convertDateTimeToTimeZone = convertDateTimeToTimeZone(parse, 12, 0, 0, DateTimeZone.forOffsetHours(2), DateTimeZone.UTC);
    System.out.println(convertDateTimeToTimeZone);
}

结果:

2015-10-01T10:00:00.000Z