Java 日期操纵的问题

Java 日期操纵的问题,java,oracle,timestamp,Java,Oracle,Timestamp,我从Oracle数据库的开始日期和结束日期中获得了2个时间戳。它们的格式为yyyy-MM-dd HH:MM:ss.SSS 现在,我从一个文本文件中获取另一个时间戳进行比较。它是字符串格式的。下面是我为提取所需信息而编写的代码 DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy"); Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011"); Syst

我从Oracle数据库的开始日期和结束日期中获得了2个时间戳。它们的格式为
yyyy-MM-dd HH:MM:ss.SSS

现在,我从一个文本文件中获取另一个时间戳进行比较。它是字符串格式的。下面是我为提取所需信息而编写的代码

    DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy");
    Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
    System.out.println("---date----" + f.format(date));
    String originalDate = f.format(date);
    System.out.println("---originalDate----" + originalDate);

    DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    String dateParse = f2.format(date);
    System.out.println("---dateParse----"+dateParse);
我得到的输出有点奇怪,而且非常不一致。下面是示例 ---日期——2011年8月23日星期二20:00:03太平洋标准时间 ---原始日期——2011年8月23日星期二20:00:03太平洋标准时间 ---日期解析----2011-08-24 08:30:03.000

在上面的输出中,我对--dateparse--值感兴趣,因为我需要它来进行比较。 现在,如果您看到理想情况下的值是变化的,那么这两个值应该是相同的

这里的问题是,如果输出随时区而变化,那么我应该如何在代码中对从数据库获取的数据进行比较

我只需要看看——dateparse——是否位于我从db获得的日期范围之间。 该代码是否独立于时区正常工作,或者这里存在一些问题。 如果日期不同,则我的比较可能出错,或者这是上述两个输出的正确方式


请告诉我如何解决这个问题。

请参考类文档并使用构造函数:

要检查您的区域设置,请使用以下代码:

Locale.getDefault()
也许这就是你得到这些结果的原因

我只需要看看——dateparse——是否位于我从db获得的日期范围之间

假设:

  • Date
    从数据库中检索对象
  • 时区信息嵌入正在解析的文件格式中
  • 然后,
    Date
    的所有实例都具有适当的绝对值(从1970年1月1日开始计算毫秒数),因此比较正确


    那么你应该注意什么呢?没有时区或区域设置信息的日期/时间字符串。如果要解析其中一个,将使用与写入数据的时间/地点不同的区域设置和时区。在这种情况下,检索到的日期可能引用了错误的绝对时间。

    如果将时区添加到第二个日期格式中,您会注意到它使用默认区域设置输出,如前所述。例如,在我的电脑上,它以英国夏季时间(英国的当前时区)显示

    DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zz");
    System.out.println("---dateParse----" + f2.format(date));
    
    输出:

    ---dateParse----2011-08-24 04:00:03.000 BST
    
    如果要强制日期格式的输出时区,可以使用以下方法执行此操作:

    然后,输出变为:

    ---dateParse----2011-08-23 20:00:03.000 PDT
    

    Locale
    一样,如果需要,也有一个
    getDefault
    方法。

    数据库中数据的时区是什么?(它真的在一个文本字段中吗?你不需要解析来自数据库的数据…)我同意@Jon的观点。您不必将数据库中的日期解析为字符串。它应该是java.util.Date。。。
    f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
    
    ---dateParse----2011-08-23 20:00:03.000 PDT