3

我的时间戳格式很少

时间戳格式包含 YYYY MM DD hh mm ss S AM/PM CountryName/CityName(zone)

YYYY-MM-DD HH:mm:ss.S
YYYY-MM-DD HH:mm:ss.S AM/PM
YYYY-MM-DD HH:mm:ss.S AM/PM z
YYYY-MM-DD HH:mm:ss.z 

我想对时间戳值进行验证,如果时间戳值是未来值(或大于现有值),那么想要向用户显示.通知消息。

对于日期格式,我编写了以下代码来检查未来日期

DateTimeFormat df = DateTimeFormat.getFormat(dateFormat);
        Date updateDate = df.parseStrict(newDateValue);
        Date synchronizedDate = df.parseStrict(synchronizedDB_DateValue);
        boolean isFutureDate = updateDate.after(synchronizedDate);
        if (isFutureDate ) {
           // send notification
        }
        else {
            // do nothing
        }

编辑:

以下代码仅适用于时间戳格式 = YYYY-MM-DD HH:mm:ss.S

                String timestampFormat = "YYYY-MM-DD HH:mm:ss.S"; // It works
                //String timestampFormat = "YYYY-MM-DD HH:mm:ss.S AM/PM"; 
                //String timestampFormat = "YYYY-MM-DD HH:mm:ss.S AM/PM z"
                //String timestampFormat = "YYYY-MM-DD HH:mm:ss.S z ";

                String newTimestampFormat=  timestampFormat.replaceAll("-", ".");
                newTimestampFormat = newTimestampFormat.replace("YYYY", "yyyy");
                newTimestampFormat = newTimestampFormat.replace("AM/PM", "a");

                DateTimeFormat df = DateTimeFormat.getFormat(newTimestampFormat);
                Date updateDate = df.parse(newTimeStampValue); // UPDATED VALUE = 2013.08.21 00:00:00.123

                Date synchronizedDate = df.parseStrict(synchronizedDB_DateValue); // current or old db value = 2013.07.11 00:00:00.123

                boolean isFutureTimestamp = updateDate.after(synchronizedDate);
                if (isFutureTimestamp ) {
                   // send notification
                }
                else {
                    // do nothing
                }

对于所有其他时间戳格式,我需要做哪些更改?

提前致谢。

4

2 回答 2

2

这是我的解决方案,它有效:)

private boolean function isFutureTimestamp(){
        String gwtTimestampFormat = convertToGwtTimeStampFormat(timestampFormat); 
        // timestampFormat = YYYY-MM-DD HH:mm:ss.S AM/PM z
        // gwtTimestampFormat = yyyy.MM.dd HH:mm:ss.S a z

        DateTimeFormat df = DateTimeFormat.getFormat(gwtTimestampFormat); 

        String newlyUpdatedTimestampValue = convertToGwtTimeStampFormat(timestampValue);
        Date updatedDateTime = df.parse(newlyUpdatedTimestampValue); 

        String currentTimestamp = convertToGwtTimeStampFormat(currentTimestampValue);
        Date currentDateTime = df.parse(currentTimestamp);

        boolean isFutureTimestamp  = updatedDateTime.after(currentDateTime);
        return isFutureTimestamp;
}

  private String convertToGwtTimeStampFormat(String gwtTimestampFormat) {

        if (gwtTimestampFormat != null && gwtTimestampFormat.length() > 20) { // "2012-12-23 23:12:32.2".length= 21
            gwtTimestampFormat = gwtTimestampFormat.replace("-", ".");
            gwtTimestampFormat = gwtTimestampFormat.replace("YYYY", "yyyy");
            gwtTimestampFormat = gwtTimestampFormat.replace("DD", "dd");
            gwtTimestampFormat = gwtTimestampFormat.replace("AM/PM", "a");
            return gwtTimestampFormat;
        }
        else {
            return "";
        }
    }
于 2013-07-29T04:27:28.033 回答
1

尝试使用 Apache DateUtils。(文档在这里)

使用 parseDate 方法,因为它支持多种格式,并且也可以在许多其他地方使用。

例如,在使用 parseDate 时,您可以将所有这些时间戳模式作为字符串数组提供给以下方法:

public static Date parseDate(String str, String[] parsePatterns) throws ParseException

接收 Date 对象。有了这个,您可以像比较数字一样比较日期:

public static int truncatedCompareTo(Date date1, Date date2, int field)

这将返回一个负整数、零或正整数,因为第一个日期小于、等于或大于第二个日期。

请注意,这些方法是static为了让您无需创建DateUtils对象即可调用它们。只需DateUtils.yourMethod(yourArgs)在您import完成罐子后使用。

于 2013-07-22T13:05:45.103 回答