Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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中处理丢失的PST小时_Java_Timezone - Fatal编程技术网

如何在Java中处理丢失的PST小时

如何在Java中处理丢失的PST小时,java,timezone,Java,Timezone,我有一个webapp,将部署在具有太平洋时区设置的服务器上。我的应用程序能够处理计算中的PSTPDT日期转换,但我面临处理丢失小时/无效时间的问题,如下所述 无效时间–由于时钟向前自动调整,3月第二个星期日凌晨02:00至凌晨03:00之间,太平洋时区不存在该时间 所以,无论何时输入日期(如2013年3月10日02:00:00),系统都会自动将其转换为2013年3月10日03:00:00。我理解这是因为这个时间实际上并不存在于太平洋时区 但根据要求,服务器时区不能更改(例如GMT),仍需要捕获上

我有一个webapp,将部署在具有太平洋时区设置的服务器上。我的应用程序能够处理计算中的PSTPDT日期转换,但我面临处理丢失小时/无效时间的问题,如下所述

无效时间–由于时钟向前自动调整,3月第二个星期日凌晨02:00至凌晨03:00之间,太平洋时区不存在该时间

所以,无论何时输入日期(如2013年3月10日02:00:00),系统都会自动将其转换为2013年3月10日03:00:00。我理解这是因为这个时间实际上并不存在于太平洋时区

但根据要求,服务器时区不能更改(例如GMT),仍需要捕获上述时间(2013年3月10日02:00:00)。另外,服务器自动调整时钟设置也无法更改,所以我必须更改应用程序代码以支持上述功能

提前感谢你的帮助

添加代码以获得更多说明:

SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy HH:mm:ss");
//sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = sdf.parse("100313 02:00:00");
Date date1 = sdf.parse("100313 03:00:00");
System.out.println(sdf.format(date));
System.out.println(sdf.format(date1));

Output:
100313 03:00:00
100313 03:00:00

If i uncomment commented line then output:
100313 02:00:00
100313 03:00:00

无论计算机的时区设置如何,您都应该能够获取当前UTC时间。Java从操作系统的详细信息中抽象了这一点,因此,任何时候文档中说您正在获取UTC值(例如从1/1/1970 UTC开始的毫秒),那么它都是准确的。UTC中没有丢失或不明确的时间

建议将服务器设置为UTC时区的原因与系统bios时钟与操作系统时钟同步的方式有关。Microsoft Windows操作系统将bios保持在本地时间,并根据需要进行调整,而Linux和Macintosh将bios保持在UTC时间。因此,在Windows系统上,如果由于某种原因调整不起作用,则时钟读取错误的可能性微乎其微


如果您的应用程序正在将输入的日期转换为仅在计算机本地时区中有意义的值,则您已将该时区投影到用户。对于桌面应用程序,这可能是正确的,因为用户正在自己的计算机上运行代码。对于web应用程序(和其他服务器端代码),这肯定是错误的,因为客户端可能与服务器位于不同的时区


请更新您的问题,以显示导致您描述的问题的应用程序中的特定代码。然后,我们可以为您指出需要进行的具体更改,以使您的应用程序正常运行。

为什么?在进入系统之前,您可以将“2013年3月10日02:00:00”作为GMT时间传递,也可以将其作为字符串参数传递,并在输入后转换为日期对象?我正在从hibernate本机查询接收日期,因此没有选项将其作为GMT传递。您说这是一个web应用程序?您是在JSP页面上运行这个还是什么?日期起源于何处,它们代表什么?你说用户正在输入它们-你是说在web浏览器中?你能在那里使用JavaScript吗?它们是否表示用户的本地时区可能与服务器时区不同,您是否在意?“UTC中没有丢失或不明确的时间。”除了闰秒之外:D“如果您的应用程序正在将输入的日期转换为仅在计算机本地时区有意义的值,则您已将该时区投影到您的用户。”日期值在任何时区都有意义,因为它们完全独立于TZ;TZ仅在将该值从/转换为人类可读格式时使用。如果服务器在转换输入的日期时采用TZ,并且输入的日期未在该TZ中表示,则解析的值是错误的。如果您从任何其他来源(如系统时间)获取日期值,应用程序将正常运行。@AlvinThompson-我说的是一般的日期/时间。Java
Date
类表示UTC是正确的,所有值都是可接受的。关于闰秒的观点很好,但它们几乎总是可以被忽略。更正:如果您从任何其他来源(如系统时间)获取日期值,应用程序将无法正常运行。我在帖子中添加了代码,以进一步澄清该问题,请注意,该代码是在系统设置为PST时区的情况下执行的。