Java 在时区之间转换数据/时间不准确


    TimeZone.setDefault(TimeZone.getTimeZone("Europe/Moscow"));
    System.out.println("Default Timezone: " + TimeZone.getDefault());
    String date = "08/04/2016 00:00:00";
    SimpleDateFormat simpleDateFormatMoscow = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    Date moscowDt = simpleDateFormatMoscow.parse(date);
    System.out.println("Moscow Date: " + simpleDateFormatMoscow.format(moscowDt));
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Bangkok"));
    System.out.println("Bangkok Date: " + simpleDateFormat.format(moscowDt));
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(moscowDt);
    calendar.setTimeZone(TimeZone.getTimeZone("Asia/Bangkok"));
    System.out.println("Bangkok Date: " + simpleDateFormat.format(calendar.getTime()));
    System.out.println("Test Timezone");
    System.out.println(TimeZone.getTimeZone("America/New_York"));
    System.out.println(TimeZone.getTimeZone("Europe/Moscow"));
    System.out.println(TimeZone.getTimeZone("Asia/Bangkok"));

我尝试使用此代码段在莫斯科和曼谷之间转换日期/时间。结果如下:

默认时区:

sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=14400000,dstSavings =0,useDaylight=false,transitions=78,lastRule=null]

莫斯科日期: 08/04/2016 00:00:00

//

util date/time

曼谷 日期: 08/04/2016 03:00:00

乔达时间

曼谷 日期: 08/04/2016 03:00:00

但是,当我使用 https://singztechmusings.wordpress.com/2011/06/23/java-timezone-correctionconversion-with-daylight-savings-time-settings/或谷歌转换日期/时间时,时间是

莫斯科日期: 08/04/2016 00:00:00

曼谷 日期: 08/04/2016 04:00:00

谁能告诉我使用 java 转换数据/时间的正确方法?谁能告诉我我做错了什么以及为什么结果不准确?

你的 Java 有错误的时区偏移量:"offset=14400000"是 4 小时,但莫斯科在过去一年半是 UTC+3。

使用 tzupdater 升级您的 java。

Java正在使用自己的时区数据,这些数据独立于主机操作系统。如果您不使用最新版本的 Java,则可能不准确,因为俄罗斯(欧洲/莫斯科(两年前已从夏令时切换到永久标准时间

这是首先使用本地时区的一种方法。

public static void main(String[] args) {
  // Create a calendar object and set it time based on the local time zone
    Calendar localTime = Calendar.getInstance();
    localTime.set(Calendar.HOUR, 17);
    localTime.set(Calendar.MINUTE, 15);
    localTime.set(Calendar.SECOND, 20);
    int hour = localTime.get(Calendar.HOUR);
    int minute = localTime.get(Calendar.MINUTE);
    int second = localTime.get(Calendar.SECOND);

    // Print the local time
    System.out.printf("Local time  : %02d:%02d:%02dn", hour, minute, second);

    // Create a calendar object for representing a Bangkok time zone. Then we set
    //the time of the calendar with the value of the local time
    Calendar BangkokTime = new GregorianCalendar(TimeZone.getTimeZone("Asia/Bangkok"));
    BangkokTime.setTimeInMillis(localTime.getTimeInMillis());
    hour = BangkokTime.get(Calendar.HOUR);
    minute = BangkokTime.get(Calendar.MINUTE);
    second = BangkokTime.get(Calendar.SECOND);

    // Print the local time in Bangkok time zone
    System.out.printf("Bangkok time: %02d:%02d:%02dn", hour, minute, second);

    //Then do the same for the Moscow time zone
    Calendar MoscowTime = new GregorianCalendar(TimeZone.getTimeZone("Europe/Moscow"));
    MoscowTime.setTimeInMillis(localTime.getTimeInMillis());
    hour = MoscowTime.get(Calendar.HOUR);
    minute = MoscowTime.get(Calendar.MINUTE);
    second = MoscowTime.get(Calendar.SECOND);

    // Print the local time in Moscow time zone
    System.out.printf("Moscow time: %02d:%02d:%02dn", hour, minute, second);
}

最新更新