如何在忽略 Java 中的时区的同时比较日期

How to compare dates while ignoring timezones in Java

我将日期和时间作为字段之一存储在我的 sql 数据库中,格式如下:dd/mm/yy hh:mm。我正在使用异步任务将此信息导入我的 android 应用程序,然后填充列表视图。

我需要做的是检查导入的日期是在当前日期和时间之后还是之前。我数据库中的所有数据都是格林威治标准时间,我想知道我应该在 java 中调用什么方法来获得当前日期和时间的最佳表示 independent 时区用户在,让我进行对比

我主要担心的是避免用户通过更改 phone 上的系统时间来欺骗应用程序。

String time1 = "16:00:00";
String time2 = "19:00:00";

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
Date date1 = format.parse(time1);
Date date2 = format.parse(time2);
long difference = date2.getTime() - date1.getTime();

这会给你以秒为单位的时差。检查这是否是肯定的,看看哪个日期是 "first"

在别处获取当前日期时间

如果您不能相信用户 device/computer 上的当前日期时间,那么您有两个选择:

  • 从其他地方获取当前日期时间。
    • 请参阅 this Question 或此问题以使用 Java/Android 从时间服务器获取当前日期时间。
    • 请参阅 this Question 从您的数据库服务器获取当前日期时间。
  • 让您的数据库服务器在搜索记录时使用自己的日期时间。
    请参阅 this or this. Pay careful attention to the various date-time functions offered by your particular database. For example, some commands return the moment when the transactions began while others return the current moment of execution. A few commands are standard SQL while most are proprietary. As an example, see the Postgres date-time functions doc 等问题。

乔达时间

如果您从其他地方获取时间,则需要使用 Java 中的日期时间值。进行此类工作时,请使用良好的日期时间库。对于 Android,这意味着 Joda-Time 库。避免使用捆绑的 java.util.Date/.Calendar,因为它们非常麻烦。

Whosebug 上还有许多关于此主题的其他问题和解答,但这里有一个未经测试的快速示例。我假设您正在使用 JDBC 驱动程序从数据库中获取 java.sql.Timestamp 值。

java.sql.Timestamp ts = myResultSet.getTimestamp( "my_column_" );  // Get date-time object from your database via JDBC driver.
…
DateTime now = … // Get current date-time from other computer as discussed above.
DateTime when = new DateTime( ts , DateTimeZone.UTC );  // Convert java.sql.Timestamp to org.joda.time.DateTime object.
Boolean rowIsPast = when.isBefore( now );  // Compare DateTime objects.

如果您要从数据库中获取数据的日期时间值的字符串表示,请尝试通过 JDBC、java.sql.Timestamp(或将来,由 Java 8 及更高版本中的新 java.time 包定义的类型)。如果您必须使用字符串表示形式,请在 Java 和 Joda-Time 中搜索 many 将字符串解析为日期时间值的示例 whosebug.com(使用搜索术语 "joda").