-1

我在服务器上检查未来日期时遇到问题。由于 Date.parse() 在 chrome 和 Firefox 下的解析方式不同。在 Firefox 下,一个负的日期时间被传递给服务器。由于我想避免这种浏览器问题,我尝试在服务器端实现验证。

Date currentDate = new Date();
Date interviewingDate = interview.getInterviewingDate();
LocalDateTime currentDateTime = convertToLocalDateTime(currentDate);
LocalDateTime interviewingDateTime = convertToLocalDateTime(interview.getInterviewingDate());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedCurrentDateTime = currentDateTime.format(formatter);
String formattedInterviewDateTime = interviewingDateTime.format(formatter);

我试图将服务器时间与案例面试时间进行比较。由于不允许未来的一天,if(interviewingDateTime.isAfter(currentDateTime)) return -1

但是当我测试它时,结果不是我所期望的。

这是一些日志:
currentDateTime.getTime() 1607592350160
interviewingDateTime.getTime() -125883137443000

formattedCurrentDateTime 2020-12-10 17:25:50
formattedInterviewDateTime 2021-12-03 13:55:00

currentDateTime toLocalDate 2020-12-10
interviewingDateTime toLocalDate -2020-12-03
interviewingDateTime.toLocalTime()13:55
currentDateTime.toLocalTime() 17:25:50.160

interviewingDateTime.isAfter(currentDateTime): false
interviewingDate.compareTo(currentDate): -1

我希望 isAfter 返回 true,因为面试时间是未来的日期。当我尝试输出本地日期和原始日期对象 getTime() 时,我看到有负值。无论如何将负数转换回正常的正数日期?或者任何其他方式来比较和检查日期是预期的未来日期?

4

2 回答 2

1

在转换之前检查您的变量 Date interviewDate。如果这不是问题,则问题可能出在方法“convertToLocalDateTime”上。试试下面的简单代码。

public static LocalDateTime convertToLocalDateTime(Date date) {
    return date.toInstant()
               .atZone(ZoneId.systemDefault())
               .toLocalDateTime();  
}
于 2020-12-10T11:42:54.033 回答
0

日期时间 APIjava.util及其格式化 APISimpleDateFormat已过时且容易出错。建议完全停止使用它们并切换到现代日期时间 API在Trail: Date Time了解现代日期时间 API 。

注意:无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。

如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available

如果我得到了如何使用现代日期时间 APIjava.util.Date

转换java.util.Datejava.time.Instant使用java.util.Date#toInstant. 下面给出一个演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

class Main {
    public static void main(String[] args) throws ParseException {
        // A sample java.util.Date
        Date interviewDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-03-05 10:30:00");

        Instant instant = interviewDate.toInstant();

        // Get the local date-time out of instant
        LocalDateTime ldt = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();

        // Now in the local date-time
        LocalDateTime now = LocalDateTime.now();

        // Compare now with ldt
        if (ldt.isAfter(now)) {
            System.out.println("Congratulation! Your interview has been scheduled on " + ldt);
        } else {
            System.out.println("The interview date-time can not be in the past.");
        }
    }
}

输出:

Congratulation! Your interview has been scheduled on 2021-03-05T10:30
于 2020-12-10T12:10:46.997 回答