将 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 UTC
,dtzConversion
是 Europe/Berlin
,dtzReturn
是 UTC
,需要设置时间12:00:00
结果是 2015 年 9 月 30 日 12:00:00。但我希望 01.10.2015 10:00:00 因为 30.09.2015 22:00:00 UTC
到 Europe/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
我有一个小的实用方法,可以将 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 UTC
,dtzConversion
是 Europe/Berlin
,dtzReturn
是 UTC
,需要设置时间12:00:00
结果是 2015 年 9 月 30 日 12:00:00。但我希望 01.10.2015 10:00:00 因为 30.09.2015 22:00:00 UTC
到 Europe/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