日期操作的问题

时间:2012-09-25 19:54:44

标签: java oracle timestamp

我从Oracle数据库的开始和结束日期得到2个时间戳。它们采用这种格式yyyy-MM-dd HH:mm:ss.SSS

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

    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      --- originalDate ---- 2011年8月23日星期二20:00:03      --- dateParse ---- 2011-08-24 08:30:03.000

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

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

我只需要看看--dateparse--是否位于我从db获得的日期范围之间。 此代码是否可以正常独立于时区,或者存在一些问题。 如果日期不同,那么我的比较可能会出错,或者是上述2个输出的正确方法。

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

3 个答案:

答案 0 :(得分:1)

请参阅课程文档并使用构造函数:

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

SimpleDateFormat(String pattern, Locale locale)

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

Locale.getDefault()

可能这就是你得到这些结果的原因。

答案 1 :(得分:0)

  

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

假设:

    从数据库中检索
  1. Date个对象
  2. 时区信息嵌入在正在解析的文件格式中
  3. 然后Date的所有实例都具有正确的绝对值(自1970年1月1日起计算毫秒数),因此可以正确比较。

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

答案 2 :(得分:0)

如果您为第二个日期格式添加时区,您会注意到它使用您的默认语言环境输出它,如barbosa指出的那样。例如,在我的电脑上,它会显示在英国夏令时,即英国目前的时区。

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

如果要强制使用日期格式的输出时区,可以使用setTimeZone方法执行此操作:

f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

然后输出变为:

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

就像Locale一样,TimeZonegetDefault方法,如有必要。