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



当作业尝试使用SimpleDateFormat.parse(datestr)呼叫时,我们遇到了一个问题,当datestr包含恰好属于 DST 规则的时间时(即20140309020100发生了ParseException(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 datetime(。

我尝试将SimpleDateFormat关联到TimeZone,但这会使返回的日期偏移 5 小时。

TimeZone utc = TimeZone.getTimeZone("UTC");
sdFormat.setTimeZone(utc);

有没有办法使用 SimpleDateFormat 来解析日期,以便它不会更改字符串上传入的日期时间,确保日期有效,并且还会忽略夏令时偏移量(即不会抛出ParseException(?

我们不打算向项目添加任何新的库,而是让它与标准Java类一起工作。


根据@GriffeyDog的回答.....

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新