为什么与 UTC 偏移量相同的时区显示的时间不同?

cod*_*der 4 java datetime date

我今天遇到了这个问题。我已将时钟设置为 UTC-6.00(中美洲)时区。我正在将日期“06/01/2015::12:00:00 AM”(“MM/dd/yyyy::hh:mm:ss a”格式)转换为 java Date 对象。然后我将日期对象重新转换为字符串。不过,我的做法略有不同。我在下面列出了重新转换步骤 -

  1. 计算与当前时区的 UTC 偏移量。(-21600000)
  2. 获取此偏移量的所有可用时区 ID。(全部具有相同的偏移量)
  3. 选择第一个时区 ID。(将具有相同的偏移量)
  4. 将其设置为时区。
  5. 使用 Java 的简单日期格式将日期转换为字符串格式。

我看到现在呈现的时间是“06/01/2015::01:00:00 AM”

我的问题:

  1. 由于时区偏移在创建和转换期间是相同的,我希望显示相同的时间。但我看到的是不同的。为什么会这样呢?

  2. 想象一下重新转换发生在服务器中,创建发生在客户端中。我需要向客户端返回相同的日期和时间。我该怎么做呢?

请帮忙!任何帮助深表感谢。

编辑:以下是代码。请注意,我已将当前时区设置为中美洲。

public class TimeTest {

public static void main (String args[]) {

    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy::hh:mm:ss a");
    String dateInString = "01/06/2015::12:00:00 AM";

    try {    
        Date date = formatter.parse(dateInString);
        System.out.println("Before conversion --> " + formatter.format(date));
        System.out.println("After conversion --> " + convertDateValueIntoString(date));


    } catch (ParseException e) {
        e.printStackTrace();
    }       
}

private static String convertDateValueIntoString(Date dateValue){
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy::hh:mm:ss a");       
    String date;
    int offset = TimeZone.getDefault().getRawOffset();
    if (offset == 0) {
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        date = dateFormat.format(dateValue);
    } else {        
        String TZ[] = TimeZone.getAvailableIDs(offset);
        String timeZone = TZ[0];
        if (timeZone == null) {
            date = dateFormat.format(dateValue);
        } else {
            TimeZone tz = TimeZone.getTimeZone(timeZone);
            dateFormat.setTimeZone(tz);
            date = dateFormat.format(dateValue);
        }           
    }

    return date;
}
}
Run Code Online (Sandbox Code Playgroud)

133*_*joe 5

  1. 为什么时间不同:

差异似乎在于夏令时的处理。将我的机器设置为不同的时区并打印 TimeZone toString() 我最终得到:

Initial: sun.util.calendar.ZoneInfo[id="America/Tegucigalpa",offset=-21600000,dstSavings=0,useDaylight=false,transitions=9,lastRule=null]
Result: sun.util.calendar.ZoneInfo[id="America/Bahia_Banderas",offset=-21600000,dstSavings=3600000,useDaylight=true,...
Run Code Online (Sandbox Code Playgroud)

请注意,这两个时区具有相同的偏移量,但一个使用夏令时,另一个不使用夏令时。您的代码正在寻找合适的时区,但日期格式也使用夏令时偏移量。

  1. 我该如何处理这个问题:

我参与的每个项目使用时间的方式都是让时间的所有内部表示都采用 UTC(或类似的概念)。我会让您的客户端在输入时将时间转换为 UTC(在将其发送到服务器之前),让所有服务器存储使用 UTC,然后当时间返回到客户端时,将客户端格式设置为默认时区,仅用于输出给用户。

这样,您的所有内部时间都是一致的,并且所有显示的时间都针对客户端的各个实例进行了本地化,因此 America/Tegucigalpa 的用户可能会看到 12:00 的时间,但 America/Bahia_Banderas 的用户会看到 1:00 。对于要显示这些时间的用户来说,两者都是正确的。