FastDateFormat解析问题

时间:2016-10-09 19:06:29

标签: java datetime

我正在尝试使用FastDateFormat字符串“0759”和“1401”进行解析,但获得ParsingException

它与SimpleDateFormat一起工作正常,但我想避免使用它,因为它不是线程安全的。我正在检查当前时间是否在特定的时间范围内以采取其他措施。我想使用FastDateFormat代替下面的代码。请指教

try{
SimpleDateFormat time_to_string = new SimpleDateFormat("HHmm");
        String executionEndTime = time_to_string.format(stepExecution.getEndTime());

        Date emailDeliveryStartTime =
                (Date) time_to_string.parse("0759");
        Date emailDeliveryEndTime =
                (Date) time_to_string.parse("1401");
        Date currentSystemTime = (Date) time_to_string.parse(executionEndTime);

        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(emailDeliveryStartTime);

        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(emailDeliveryEndTime);

        Calendar calendar3 = Calendar.getInstance();
        calendar3.setTime(currentSystemTime);

        Date isEmailTime = calendar3.getTime();

        if (isEmailTime.after(calendar1.getTime()) && isEmailTime.before(calendar2.getTime())) {
            //return flowexecutionstatus 
        }
} catch (ParseException ex) {
        //log message
}

1 个答案:

答案 0 :(得分:1)

FastDateFormat.parse(String)州的文件:

  

相当于DateFormat.parse(String) 有关详细信息,请参阅DateFormat.parse(String)

现在有DateFormat.parse(String)个州的文件:

  

从给定字符串的开头解析文本以生成日期。   该方法可能不会使用给定字符串的整个文本。

     

有关详细信息,请参阅parse(String, ParsePosition) 方法   日期解析。

parse(String, ParsePosition)的文档说明:

  

此解析操作使用calendar生成日期。 作为一个   结果,calendar的日期时间字段和TimeZone值可能   已被覆盖,具体取决于子类实现。任何   之前通过调用setTimeZone设置的TimeZone值   可能需要恢复以进行进一步的操作。

因此,我们可以从上面得到的结论是FastDateFormat.parse(String)基本上使用calendar对象,然后覆盖该对象的日期时间字段,然后生成Date它的对象。

SimpleDateFormat.parse(String)的工作存在细微差别。没有覆盖parse(String)方法,但parse(String, ParsePostion)被覆盖且其documentation状态:

  

此解析操作使用日历生成日期。 所有的   日历的日期时间字段在解析之前被清除,并且   日历的日期时间字段的默认值用于任何   缺少日期时间信息。例如,年份值   如果没有给出年份值,则使用GregorianCalendar解析日期为1970年   来自解析操作。 TimeZone值可能会被覆盖,   取决于给定的模式和文本中的时区值。任何   之前通过调用setTimeZone设置的TimeZone值   可能需要恢复以进行进一步的操作。

换句话说,我认为SimpleDateFormat.parse(String)能够提供所需的结果,因为它替换了缺失字段的默认值,而FastDateFormat.parse(String)无法解析,因为您缺少字段您提供的日期时间字符串,无法替换。

最后,尽管您尚未展示如何实例化FastDateFormat变量。如果您已实例化为:

FastDateFormat time_to_string = FastDateFormat.getInstance();

然后我会建议您使用以下内容:

FastDateFormat time_to_string = FastDateFormat.getInstance("HHmm");