2015-10-12 50 views
3

我有,其中转换的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结果是30.09.2015 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。这在UTC01.10.2015 10:00:00。我的错在哪里?

回答

4

方法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

+0

似乎是正确的。但为什么第一次时区转换的时间毫秒是相同的? 'DateTime dtClientTimezone = dateTime.withZone(dtzConversion);'with'dateTime' millis为1443650400000(30.09.2015 22:00:00),'dtzConversion'为'Europe/Berlin',现在'dtClientTimezone' millis也为1443650400000。 ?毫米应该是2个小时。不是吗? – opfau

+0

也许'datetime'的时区设置为德国时区,则不会进行调整。用一个例子更新代码。 – flo

+0

你的意思是像当地时区吗?在我的情况下,它发生在服务器上,所以我只想将这些millis转换为特定的时区。我对乔达时间有点困惑。 – opfau