如何在Java中忽略时区的情况下比较日期



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

我需要做的是检查导入的日期是否在当前日期和时间之后或之前。我的数据库中的所有数据都是GMT格式的,我想知道我应该用java调用什么方法来获得当前日期和时间的最佳表示,独立于用户所在时区的,这样我就可以进行比较了。

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

在其他地方获取当前日期时间

如果你不能信任用户设备/计算机上的当前日期时间,那么你有两个选择:

  • 从其他地方获取当前日期时间。
    • 有关使用Java/Android从时间服务器获取当前日期时间的信息,请参阅此问题或此问题
    • 有关从数据库服务器获取当前日期时间的信息,请参阅此问题
  • 让数据库服务器在搜索记录时使用自己的日期时间
    请参阅类似的问题。请仔细注意特定数据库提供的各种日期-时间函数。例如,一些命令返回事务开始的时刻,而另一些命令返回当前执行时刻。少数命令是标准SQL,而大多数是专有命令。例如,请参阅Postgres日期-时间函数文档

Joda时间

如果您从其他地方获得时间,那么您需要使用Java中的日期-时间值。做这样的工作时,使用一个好的约会时间库。对于Android来说,这意味着Joda Time库。避免使用捆绑的java.util.Date/.Calendar,因为它们是出了名的麻烦。

关于这个主题,StackOverflow上还有很多其他的问答,但这里有一个未经测试的快速示例。我假设您正在使用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包定义的类型的对象(。如果您必须使用字符串表示,请在StackOverflow.com上搜索许多示例,这些示例使用Java&Joda时间(使用搜索词"Joda"(。

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();

这会给你以秒为单位的时间差。检查是否为正,以查看哪个日期是"第一个">

相关内容

  • 没有找到相关文章

最新更新