【问题标题】:Passing Date objects between two differnet time zones without applying Time Zone conversions in java在两个不同时区之间传递 Date 对象而不在 java 中应用时区转换
【发布时间】:2012-03-19 05:30:10
【问题描述】:

我有两个程序在两台服务器上。程序 A 在英国服务器,程序 B 在美国服务器。

我需要将日期对象从程序 A 传递给程序 B。但是当我从程序 B 获取日期对象时,我会通过时区转换收到它。如何在不应用此时区转换的情况下将日期对象从一台服务器传递到另一台服务器。

注意:我知道这件事可以通过 Calender 对象来完成,如下所示。但就我而言,我想使用 Date 对象。

在程序 B 中:

Date checkInDate  = new Date(cal1.get(Calendar.YEAR) - 1900 , cal1.get(Calendar.MONTH) , cal1.get(Calendar.DATE), cal1.get(Calendar.HOUR_OF_DAY), cal1.get(Calendar.MINUTE), cal1.get(Calendar.SECOND));
Date checkOutDate = new Date(cal2.get(Calendar.YEAR) - 1900 , cal2.get(Calendar.MONTH) , cal2.get(Calendar.DATE), cal2.get(Calendar.HOUR_OF_DAY), cal2.get(Calendar.MINUTE), cal2.get(Calendar.SECOND));

【问题讨论】:

  • java.util.Calendar 用于表示日期和日期转换,java.util.Date 中的大多数方法也已弃用...为什么您不想使用 Calendar?
  • 一个 java.util.Date 是一个绝对时间点,它没有时区。无法按预期工作的代码示例将非常有助于理解您的问题:) 以及有关您用于在服务器之间传递对象的方法的信息。
  • 你如何通过约会?网页服务?通过数据库和 JDBC?还有什么?答案可能因每种传输方式而异,但通常在传输前转换为“已知”时区 (GMT) 是一个很好的解决方案。此外,您为什么不想要 TZ 转换?
  • 我通过 java 序列化传递对象
  • 序列化和反序列化java.util.Date 不会应用任何时区效果。 Date 反序列化将与Date 序列化相同。如果您观察到差异,那是因为您做错了什么。

标签: java datetime date timezone


【解决方案1】:

使用Date.getTime() 序列化日期会更好,它给出了自纪元以来的毫秒数(1970 年 1 月 1 日,格林威治标准时间 00:00:00)。这是对时间点的完全明确的引用。您可以通过调用Date(long date) 构造函数来重新创建日期。

【讨论】:

  • 非常感谢 SimonC 的想法。
  • 这不是必须的。当 Date 被序列化时,it writes out exactly that value。 Namal 有问题是因为他做错了什么,而不是因为 Date 的麻烦行为。
  • @TomAnderson,你完全正确,我应该先检查一下。
  • 没问题。凯恩斯曾写道:“有时犯错并没有什么坏处——尤其是当你及时发现错误时”!
【解决方案2】:

由于我正在实现Serializable,我发现我也可以使用以下方法。

private void writeObject(ObjectOutputStream oos) throws IOException {
    oos.defaultWriteObject();
    if (null != checkInDate)
        oos.writeUTF(new java.text.SimpleDateFormat("yyyy-MMM-dd hh:mm").format(checkInDate));
}

private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { 

    ois.defaultReadObject();
    try {
        setCheckInDate(new java.text.SimpleDateFormat("yyyy-MMM-dd hh:mm").parse(ois.readUTF()));
    } catch (ParseException e) {

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多