gpt4 book ai didi

Java 日历 setTimeZone 方法行为

转载 作者:行者123 更新时间:2023-11-29 07:46:01 31 4
gpt4 key购买 nike

当我在带有 java6 的 Windows 上运行下面的代码时,它会打印以下输出。

private static SimpleDateFormat timeZoneFormatter = new SimpleDateFormat("Z");
public static void main(String[] args) {
try {
String format = "yyyyMMdd";

SimpleDateFormat dateFormat = new SimpleDateFormat(format);
Date date1 = dateFormat.parse("20140330");
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);

Date date2 = dateFormat.parse("20140401");

Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
calendar1.setTimeZone(TimeZone.getTimeZone("GMT"));
calendar2.setTimeZone(TimeZone.getTimeZone("GMT"));

System.out.println(timeZoneFormatter.format(calendar1.getTime()));
System.out.println(timeZoneFormatter.format(calendar2.getTime()));
} catch (Exception e) {
e.printStackTrace();
}
}
+0200
+0300

据我所知,无论我在日历对象上设置什么时区,它都采用 SimpleDateFormat 对象上的默认时区信息。我在这里错过了什么吗?如果这是正常行为,在什么情况下我们应该使用 Calendar.setTimezone() 方法?

最佳答案

时区设置在您的示例中无效的原因是:而不是应用
setTimeZone 到日历对象,应该将 setTimeZone 应用到 timeZoneFormatter 对象。

请参阅下面我的可执行示例代码。此代码将演示时区的用法和效果。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class TimeZoneTEST {
private static SimpleDateFormat timeZoneFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
public static void main(String[] args) {
try {
String timezone_GMT = "GMT";
String timezone_NYC = "America/New_York";
long currentLongTime = System.currentTimeMillis();

// Effect of time zone when displaying time as hhmm
System.out.format("Current time(HHMM) in [%s] time zone is [%d]\n", timezone_GMT, getCurrentTime(currentLongTime, timezone_GMT));
System.out.format("Current time(HHMM) in [%s] time zone is [%d]\n", timezone_NYC, getCurrentTime(currentLongTime, timezone_NYC));

// Effect of time zone when displaying the formatted string representation of time
System.out.format("Current time(String representation) in [%s] time zone is [%s]\n", timezone_GMT, fmtDateWithTZ(currentLongTime,timezone_GMT));
System.out.format("Current time(String representation) in [%s] time zone is [%s]\n", timezone_NYC, fmtDateWithTZ(currentLongTime,timezone_NYC));
} catch (Exception e) {
}
}

public static int getCurrentTime(long longTime, String timeZone){
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(timeZone));
cal.setTimeInMillis(longTime);
int hhmm = cal.get(Calendar.HOUR_OF_DAY) * 100 + cal.get(Calendar.MINUTE);
return hhmm;
}

public static String fmtDateWithTZ( long ms, String timeZone) {
timeZoneFormatter.setTimeZone(TimeZone.getTimeZone(timeZone));
return timeZoneFormatter.format( new Date( ms) );
}
}

运行代码后,应该会看到以下输出(实际显示的时间将是当前时间):

Current time(HHMM) in [GMT] time zone is [945]

Current time(HHMM) in [America/New_York] time zone is [545]

Current time(String representation) in [GMT] time zone is [2014-09-09 09:45:42 GMT]

Current time(String representation) in [America/New_York] time zone is [2014-09-09 05:45:42 EDT]

旁注,通过应用不同的时区,可以根据指定的时区不同地显示相同的时间组件。这要与时间的长时间表示法区分开来,后者测量自 1970 年 1 月 1 日午夜以来经过的毫秒数。该量是时区中性的,其值不会随时区而变化。

关于Java 日历 setTimeZone 方法行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25740680/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com