繁体   English   中英

Java SimpleDateFormat.parse()由于DST错误

[英]Java SimpleDateFormat.parse() Error due to DST

datestr包含恰好在DST规则之内的时间时SimpleDateFormat.parse(datestr)20140309020100yyyyMMddHHmmss发生了ParseException SimpleDateFormat.parse(datestr)当它尝试使用SimpleDateFormat.parse(datestr)调用时,我们遇到了一个问题。

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

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;
     }
}

这仍然具有与以前相同的问题( datetime ParseException )。

我尝试将SimpleDateFormat关联到TimeZone ,但是这样做使得返回的日期偏移了5个小时。

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

有没有一种方法可以使用SimpleDateFormat来解析日期,以使它不会更改String上传递的日期时间,将确保该日期有效,并且还将忽略夏时制偏移量(即,“抛出ParseException )?

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


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

SimpleDateFormat.parse()调用返回的Date对象将在其运行的时区中。 就我而言,EDT。 即使设置SimpleDateFormat的时区也无济于事-除了它会解析对于EDT不好的datetimestamp以外的事实。 Date对象中将获取的内容将转换为本地时间。 由于为此更改JVM设置不是一个可行的选择(共享服务器),因此我如下修改了代码:

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

这似乎可以满足我们的要求。 现在将允许20140309020500作为有效日期。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM