Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java时区:为什么需要偏移量_Java - Fatal编程技术网

Java时区:为什么需要偏移量

Java时区:为什么需要偏移量,java,Java,我的要求如下: 我在数据库和时区中以毫秒为单位保存时间。例如,在long中以毫秒为单位的时间是1223123123232,时区是Asia/Calcutta。我必须把它转换成非洲/阿斯马拉时区 long l = 1223123123232l; TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta"); long tzOff = tz.getOffset(l); java.util.Date d = new Date(l-tzOff); // WHY

我的要求如下:

我在数据库和时区中以毫秒为单位保存时间。例如,在long中以毫秒为单位的时间是
1223123123232
,时区是
Asia/Calcutta
。我必须把它转换成
非洲/阿斯马拉
时区

long l = 1223123123232l;
TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
long tzOff = tz.getOffset(l);
java.util.Date d = new Date(l-tzOff);   // WHY THIS??
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone
String s = df.format(d);
System.out.println(s);
要检查,我引用以下内容:

我的问题是:

  • 如果时区只是不同格式的时间表示(从GMT偏移的地理区域),为什么我需要从实际时间减去偏移时间
    (l-tzOff)
  • 为什么我不能忽略在数据库中保存的时区,而只考虑要转换日期的TimeZOME? 比如:

    long l = 1223123123232l;
    java.util.Date d = new Date(l);
    DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm:ss z");
    df.setTimeZone(TimeZone.getTimeZone("Africa/Asmara"));// required timezone
    String s = df.format(d);
    System.out.println(s);
    
    我的系统时区是
    亚洲/加尔各答
    ,我想将
    非洲/布琼布拉
    时区中的日期转换为
    欧洲/梵蒂冈
    时区。在这种情况下,上述代码不起作用?为什么会这样?

    。因此,如果我在纽约保存14H00,它将与巴黎的14H00不同,尽管毫秒值相同。您需要使用唯一的引用来保存日期。人们通常选择GMT+0

    如果您需要跨时区检查本地时间,可以使用我开发的工具

    回答您的问题:

  • 时区不是时间的代表,它是时间的局部化。删除偏移量的原因是为了确保所有时间都是根据相同的引用定义的
  • 因为你会得到错误的结果和错误的日期
    取自GMT纪元以来的毫秒数。因为在您的例子中,
    l
    是自其他时间点(即1970年1月1日,亚洲/加尔各答的00:00:00)起的毫秒数,您必须首先将其转换为GMT。这是通过减去相关的时区偏移量来完成的。

    Thnx作为回答,先生,但是,如果我没有错的话,只有一个历元。@RiteshKaushik:没错。但是,你的
    l
    不是从历元的偏移量,而是从其他时间点的偏移量,你需要对此进行更正。先生,我的默认时区是
    Asia/Calcutta
    。我想将日期从
    利比亚
    时区转换为
    非洲/布琼布拉
    。上面我粘贴的代码没有给出正确的结果?先生,我的默认时区是
    Asia/Calcutta
    。我想将日期从
    利比亚
    时区转换为
    非洲/布琼布拉
    。上面我粘贴的代码没有给出正确的结果?没有。你应该使用我在答案开头发布的链接中提供的代码示例。请参阅“在时区之间转换日期”部分。