解析远程服务器上的日期时间
parsing dateTime on remote server
我在一台远程服务器上遇到问题。我有代码:
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
问题是它 returns(时间 - 一小时)然后是一台远程服务器上的源时间。在我的本地服务器上不会发生此类错误。那么为什么会发生这种情况,因为我使用 DateTimeZone.getDefault() 应该 return localServer timeZone
那么为什么结果日期 = 当前日期 - 一小时?
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
一件奇怪的事情是,在另一台具有相同 time/zone 相同代码的服务器上给出了另一个结果。
这段代码在理论上是否正确?因为我认为服务器属性的配置有一些错误
假设来源是标准的 java.util.Date,您为什么要简单地将日期串起来?它们将使用服务器的时区进行格式化,即使您通过大量代码处理时区。我认为您真的应该研究 Java 中日期时间的行为方式。一方面,您使用的方法 (getDate()) 已被弃用很长时间(没有双关语意)
请注意,日期对象只是一个 long 值的包装器,它是某个时间点的 unix 纪元值。我真的看不出你到底想做什么,但我觉得它可以简单得多。据我所知,所有的字符串操作似乎基本上都是不必要的。他们当然不需要尝试将任何内容更改为 Date 对象的时区,因为 Date 中根本没有存储时区信息。时区仅在格式化日期时发挥作用,以便人类或其他不理解纪元值的系统可读。
为了深入阅读,我可以推荐 http://www.odi.ch/prog/design/datetime.php,它解释了大量有关如何使用日期和时间的信息。在这种情况下最重要的一点是 Date 对象本身永远不会在某个时区。
感谢您的建议和帮助。最好在输入 Class 中引入附加字段 TimeZone,然后在 java 代码中对其进行转换。
其实我的代码没有任何问题。问题出在服务器配置上
我在一台远程服务器上遇到问题。我有代码:
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
问题是它 returns(时间 - 一小时)然后是一台远程服务器上的源时间。在我的本地服务器上不会发生此类错误。那么为什么会发生这种情况,因为我使用 DateTimeZone.getDefault() 应该 return localServer timeZone 那么为什么结果日期 = 当前日期 - 一小时?
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 一件奇怪的事情是,在另一台具有相同 time/zone 相同代码的服务器上给出了另一个结果。
这段代码在理论上是否正确?因为我认为服务器属性的配置有一些错误
假设来源是标准的 java.util.Date,您为什么要简单地将日期串起来?它们将使用服务器的时区进行格式化,即使您通过大量代码处理时区。我认为您真的应该研究 Java 中日期时间的行为方式。一方面,您使用的方法 (getDate()) 已被弃用很长时间(没有双关语意)
请注意,日期对象只是一个 long 值的包装器,它是某个时间点的 unix 纪元值。我真的看不出你到底想做什么,但我觉得它可以简单得多。据我所知,所有的字符串操作似乎基本上都是不必要的。他们当然不需要尝试将任何内容更改为 Date 对象的时区,因为 Date 中根本没有存储时区信息。时区仅在格式化日期时发挥作用,以便人类或其他不理解纪元值的系统可读。
为了深入阅读,我可以推荐 http://www.odi.ch/prog/design/datetime.php,它解释了大量有关如何使用日期和时间的信息。在这种情况下最重要的一点是 Date 对象本身永远不会在某个时区。
感谢您的建议和帮助。最好在输入 Class 中引入附加字段 TimeZone,然后在 java 代码中对其进行转换。
其实我的代码没有任何问题。问题出在服务器配置上