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

时间:2015-06-10 17:47:46

标签: java android timezone

我将日期和时间存储为我的sql数据库中的一个字段,格式如下:dd/mm/yy hh:mm。我正在使用asynctask将此信息导入我的Android应用程序,然后填充listview。

我需要做的是检查导入的日期是在当前日期和时间之前还是之前。我的数据库中的所有数据都是GMT,我想知道我应该在java中调用什么方法来最好地表示当前日期和时间独立用户所在的时区,以便我可以进行比较。

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

2 个答案:

答案 0 :(得分:1)

获取当前日期时间

如果您无法信任用户设备/计算机上的当前日期时间,那么您有两种选择:

  • 从其他地方获取当前日期时间。
    • 请参阅this Question或此问题,了解使用Java / Android的时间服务器的当前日期时间。
    • 有关从数据库服务器获取当前日期时间的信息,请参阅this Question
  • 在搜索记录时,让您的数据库服务器使用自己的日期时间。
    请参阅thisthis等问题。请特别注意特定数据库提供的各种日期时间功能。例如,某些命令返回事务开始的时刻,而其他命令则返回当前执行的时刻。一些命令是标准SQL,而大多数是专有的。例如,请参阅Postgres date-time functions doc

约达时间

如果您从其他地方获得时间,那么您需要使用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和Java中的日期时间值。 Joda-Time(使用搜索词“joda”)。

答案 1 :(得分:0)

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

这会给你几秒钟的时差。检查这是否是正面的,看看哪个日期是"第一个"