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

在Java中如何在忽略时区的情况下比较日期,java,android,timezone,Java,Android,Timezone,我将日期和时间存储为sql数据库中的一个字段,格式如下:dd/mm/yy hh:mm。我正在使用asynctask将此信息导入我的android应用程序,然后填充listview 我需要做的是检查导入的日期是否在当前日期和时间之后或之前。我数据库中的所有数据都是以GMT为单位的,我想知道我应该用java调用什么方法来获得当前日期和时间的最佳表示,而不受用户所在时区的影响,这样我就可以进行比较了 我主要关心的是避免用户通过更改手机上的系统时间来欺骗应用程序 String time1 = "16:0

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

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

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

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();
这将为您提供以秒为单位的时差。检查是否为正数,查看哪个日期是“第一个”

从别处获取当前日期时间 如果您不能信任用户设备/计算机上的当前日期时间,则有两种选择:

  • 从其他地方获取当前日期时间。
    • 有关使用Java/Android从时间服务器获取当前日期时间的信息,请参阅或回答此问题
    • 有关从数据库服务器获取当前日期时间的信息,请参阅
  • 让您的数据库服务器在搜索记录时使用自己的日期时间。
    请参阅或之类的问题。请仔细注意特定数据库提供的各种日期时间函数。例如,一些命令返回事务开始的时刻,而另一些命令返回当前执行的时刻。少数命令是标准SQL,而大多数命令是专有的。作为示例,请参见
乔达时间 如果您从其他地方获得时间,则需要使用Java中的日期时间值。当做这些工作时,使用一个好的日期时间库。对于Android来说,这意味着图书馆。避免绑定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 time中的日期时间值的示例(使用搜索词“Joda”)。

这是否也会考虑到日期,同时忽略用户的系统时间?我主要关心的是避免用户通过更改手机上的系统时间来欺骗应用程序。这没有考虑其中一个日期是GMT。@mankee您必须稍微修改字符串以包含日期。这是否会被滥用完全取决于代码检索这些日期的方式,而不是转换。@JesseShellabarger我在oncreate方法中启动了一个AsyncTask,从联机数据库检索日期,下一步是进行比较,如果日期在当前日期之后,则不要在listview中显示该项,如果在当前日期之前,则显示item@makee我想这取决于当时手机的使用时间。我不知道它是如何工作的,但我相信它会从运营商那里提取这些数据,是吗?你使用的是哪种日期?例如13/10/15 15:30,所以dd/mm/yy hh:mm 24小时格式,所以它只是一个字符串是的,我主要担心的是,它不受时区和系统时间的影响,因此用户无法更改手机中的时间并欺骗应用程序。您有joda或java 8吗?