Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 在远程服务器上解析dateTime_Java_Date_Jodatime - Fatal编程技术网

Java 在远程服务器上解析dateTime

Java 在远程服务器上解析dateTime,java,date,jodatime,Java,Date,Jodatime,我在一个远程服务器上遇到问题。我有密码: source.setDate("20150120"); source.setTime("080000"); Date date = DateTimeFormat.DATE.get().withZone(DateTimeZone.getDefault()).parseDateTime(source.getDate()).toDate(); DateTime dateTime = new DateTime(date, DateTimeZone.getDe

我在一个远程服务器上遇到问题。我有密码:

source.setDate("20150120");
source.setTime("080000");

Date date = DateTimeFormat.DATE.get().withZone(DateTimeZone.getDefault()).parseDateTime(source.getDate()).toDate();

DateTime dateTime = new DateTime(date, DateTimeZone.getDefault());
final DateTime newDateTime = DateTimeFormat.TIME.get().withZone(DateTimeZone.getDefault()).parseDateTime(source.getTime());
dateTime = newDateTime.withDate(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth());
结果是

date = Mon Jan 19 23:00:00 GMT+03:00 2015
dateTime = Tue Jan 20 7:00:00 GMT+03:00 2015
问题是,它返回(时间为一小时),然后在一个远程服务器上返回源时间。在我的本地服务器上,这样的错误不会发生。那么为什么在使用DateTimeZone.getDefault()时会出现这种情况呢?它应该返回localServer时区 那么为什么结果日期=当前日期-一小时

UPD1。 DateTimeFormat实际上是一个带有值的枚举

public enum DateTimeFormat {
    TIME("HHmmss"),
    DATE("yyyyMMdd");

    private final DateTimeFormatter value;

    public DateTimeFormatter get() {
        return value;
    }
我的目标是在任何服务器上解析日期和时间,任何时区都是相同的时间和日期

所以如果我分析时间8:00,它应该在所有时区显示8:00

例如,当前的示例DateTimeZone.getDefault()是Europe/Moscow 奇怪的是,在另一台具有相同时区的服务器上,相同的代码会给出另一个结果


这个代码理论上正确吗?因为我发现服务器属性的配置有一些错误,假设源是一个标准的java.util.Date,为什么要简单地串日期呢?它们将使用服务器的时区进行格式化,即使您在使用时区进行操作时会经历很多代码。我认为您真的应该研究datetime在Java中的行为。首先,您正在使用的方法(getDate())已经被弃用很长时间了(没有双关语)

请注意,date对象只是一个长值的包装器,该长值是某个时间点的unix历元值。我真的看不出你到底想做什么,但我觉得可以简单得多。据我所知,所有的字符串操作在很大程度上都是不必要的。它们当然不需要尝试更改日期对象的时区,因为日期中根本没有存储的时区信息。时区仅在格式化日期以使其对不理解历元值的人或其他系统可读时起作用


为了深入阅读,我可以推荐这本书,它解释了如何处理日期和时间。在这种情况下,最重要的一点是Date对象本身从不在某个时区。

感谢您的建议和帮助。最好在输入类中引入额外的字段时区,然后在java代码中对其进行转换


实际上我的代码没有问题。问题在于服务器的配置

感谢您提供的有用链接。我用upd1更新了这个问题很难说到底是什么问题,但老实说,我不喜欢使用服务器的默认时区,因为它们几乎从来都不相关,而且您会遇到像您这样的问题。在我看来,服务器的物理位置通常并不重要,尽管在某些情况下/应用程序中它确实重要。在我开发的框架中,我们使用UTC或用户定义的时区执行所有时区操作,该时区未连接到服务器正在运行的时区。但如果我有逻辑将任何服务器上的输入时间(例如12:00:00)转换为任何服务器上的同一时间(例如12:00:00),则无法应用UTC和用户定义时区的方法?+不,这是真的。但是为什么要将任意时间转换为另一个任意时间呢?他们唯一的共同点是在某个时区的12点,但这一事实几乎总是毫无意义的。对于这样的需求(例如总是需要在某个本地时间启动某些事件)有一些有效的案例,但它们非常罕见。[a]太多的代码。给出一个[简单的例子,最少的代码],明确的输入、输出和期望。看见请修改你的问题。[b] 关于StackOverflow的数百个现有问题和答案几乎可以肯定地解决了这一问题。休息一小时肯定是时区问题的征兆。问题被修改为更简单的版本。您不给我们“source”后面的源,不给我们由
source.getDate()
生成的日期对象值,也不给我们默认的日期时区。应用调整时区的格式化程序。您没有解释此代码的目的/目标。我看不出我们有多希望在这方面提供帮助。问题的另一个问题是:Joda TIME 2.7课程中没有
DateTimeFormat.DATE
DateTimeFormat.TIME
。很抱歉没有完整的问题,UPD1补充道