Java SimpleDateFormat.parse()由于DST导致的错误

时间:2014-03-12 20:45:25

标签: java datetime simpledateformat dst

SimpleDateFormat.parse(datestr)包含的时间碰巧属于DST规则(即datestr发生在ParseException时,我们遇到了一个问题,当它尝试使用20140309020100来电时{1}}(yyyyMMddHHmmss)。

我正在尝试构建代码来处理这个问题并使其通用以使用我们所有不同的格式:

public static Date validDateTimestamp(String datetime, String [] formats) 
throws ParseException
{
    for (int inx=0; inx < formats.length; inx++)  
    { 
        try {
          return checkDateFormat(datetime, formats[inx]);

        }
        catch (ParseException e1)
        {
           // ignore this error, just try the next format
        }
    }
// no good date returned using any format, throw an exception
throw new ParseException("bad date: " + datetime, 0);
}
private static Date checkDateFormat(String datetime, String format) 
throws ParseException
{
    SimpleDateFormat sdFormat = new SimpleDateFormat(format);
    sdFormat.setLenient(false);
    try {
        return sdFormat.parse(datetime);
     } catch (ParseException e)
     {
        throw e;
     }
}

这仍然存在与以前相同的问题(ParseException的{​​{1}})。

我尝试将datetimeSimpleDateFormat相关联,但这使得返回的日期偏移了5个小时。

TimeZone

有没有办法使用TimeZone utc = TimeZone.getTimeZone("UTC"); sdFormat.setTimeZone(utc); 来解析日期,这样它就不会改变日期时间与传入字符串的日期,确保日期有效,也会忽略日光保存时间偏移(即不会抛出SimpleDateFormat)?

我们不打算在项目中添加任何新库,而是让它使用标准Java类。

<小时/> 基于@GriffeyDog .....

的答案

ParseException调用返回的Date对象将位于运行所在的时区。就我而言,EDT。即使设置SimpleDateFormat.parse()的时区也无济于事 - 除了它将解析EDT的日期时间戳错误这一事实;将进入Date对象的内容将转换为本地时间。由于为此更改JVM设置不是一个可行的选项(共享服务器),而是我按如下方式修改了代码:

  • 让两种方法都返回SimpleDateFormat
  • 修改String,以便将其分配给checkDateFormat对象而不是返回sdFormat.parse(datetime)
  • 设置新格式以标准化日期返回Date - String
  • 使用该格式返回日期yyyyMMdd HH:mm:ss - String
  • 修改使用日期的Oracle调用以使用Oracle的sdFormat.format(date)函数,而不是依赖于to_date()对象的转换

这似乎做了我们想要的。现在,Date将被允许作为有效日期。

1 个答案:

答案 0 :(得分:0)

您正在返回一个Date对象,该对象表示自1970年1月1日00:00 UTC以来的确切毫秒数。如果您没有为其提供有效的日期/时间,则SimpleDateFormat#parse无法为您提供此类Date对象。为了将您的日期/时间字符串转换为DateSimpleDateFormat需要一个时区来使用。如果您没有为其提供时区,它将使用您的默认语言环境的时区。在您的默认时区中,存在DST,并且您没有为这些注意事项提供有效的日期/时间字符串。