我想以这种格式获取设备的当前时间:2013-10-17 15:45:01?
服务器将对象的日期作为字符串以上述格式发送给我。现在我想获取手机当前时间,然后检查是否超过5分钟的差异?
A:如何以此格式2013-10-17 15:45:01
获取设备的当前时间。
B:如何计算两者之间的差异。
SimpleDateFormat
来指定您想要的日期时间格式:new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date())
然而,如果你只想知道时间差是否在某个阈值内,那么你应该比较长整型数值。如果你的阈值是5分钟,则为5 * 60 * 1000
毫秒,因此你可以通过调用相同的SimpleDateFormat
对象的parse
方法来检查长整型数值。
示例:
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2013-10-13 14:54:03").getTime()
new SimpleDateFormat(...)
构造函数的第二个参数中,您应该指定一个区域设置,例如 Locale.US
。 - cawDate currentDate = new Date();
会使用当前时间初始化一个新的日期。此外,将服务器提供的时间进行转换并计算差值。
String objectCreatedDateString = "2013-10-17 15:45:01";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date objectCreatedDate = null;
Date currentDate = new Date();
try
{objectCreatedDate = format.parse(objectCreatedDateString);}
catch (ParseException e)
{Log.e(TAG, e.getMessage());}
int timeDifferential;
if (objectCreatedDate != null)
timeDifferential = objectCreatedDate.getMinutes() - currentDate.getMinutes();
Duration.between( // Calculate time elapsed between two moments.
LocalDateTime // Represent a date with time-of-day but lacking the context of a time zone or offset-from-UTC.
.parse( "2013-10-17 15:45:01".replace( " " , "T" ) )
.atOffset( ZoneOffset.UTC ) // Returns an `OffsetDateTime` object.
.toInstant() , // Returns an `Instant` object.
Instant.now() // Capture the current moment as seen in UTC.
)
.toMinutes()
> 5
其他答案已经过时,使用的类已被现代的java.time类所替代,这些类在JSR 310中定义。
解析您的输入字符串。
String input = "2013-10-17 15:45:01" ;
修改输入以符合ISO 8601标准。我建议你向你的数据发布者介绍ISO 8601标准。
String inoutModified = input.replace( " " , "T" ) ;
将此输入解析为LocalDateTime
,因为它缺少预期偏移量或时区的指示器。
LocalDateTime ldt = LocalDateTime.parse( input ) ;
我猜测输入意图是表示一个以协调世界时(UTC)为基准的时间点,偏移量为零小时零分零秒。如果是这样,请告诉数据发布者,在结尾添加Z
标记以便清晰表明,符合ISO 8601标准。
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
Instant
。该类始终处于UTC时间。Instant then = odt.toInstant() ;
获取当前在UTC中看到的时间。
Instant now = Instant.now() ;
计算差异。
Duration d = Duration.between( then , now ) ;
获取总共的分钟数作为持续时间。
long minutes = d.toMinutes() ;
测试。
if ( minutes > 5 ) { … }
java.time 框架内置于 Java 8 及以后的版本中。这些类替代了陈旧而麻烦的旧日期时间类,如 java.util.Date
、Calendar
& SimpleDateFormat
。
要了解更多信息,请参见 Oracle 教程。同时,在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
现在处于维护模式的 Joda-Time 项目建议迁移到 java.time 类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。无需字符串,也无需 java.sql.*
类。Hibernate 5 和 JPA 2.2 支持 java.time。
在哪里获取 java.time 类?
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
dateFormatter.format(date);
还要检查这个文档
public String getClientTime() {
Time clientTime = new Time().setToNow();
return clientTime.format("%Y-%m-%d %H:%M:%S");
}
public int diffClientAndServerTime(String svrTimeStr) {
Time svrTime = new Time();
svrTime.parse3339(svrTimeStr);
Time clientTime = new Time();
clientTime.setToNow();
return svrTime.compare( svrTime, clientTime);
}
我也尝试了这个方法,最终它对我起作用了:
fun getTimeAgo(dateString: String): String {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val then = LocalDateTime.parse(dateString
.replace(" ","T"))
.atOffset(ZoneOffset.UTC)
.toInstant()
val now = LocalDateTime.now().atOffset(ZoneOffset.UTC).toInstant()
val diff = Duration.between(then, now).seconds
return when {
diff < 60 -> "$diff seconds ago"
diff < 3600 -> "${diff / 60} minutes ago"
diff < 86400 -> "${diff / 3600} hours ago"
else -> "${diff / 86400} days ago"
}
} else {
return dateString
}
}
SimpleDateFormat
、Calendar
或Date
。多年前,它们被现代的java.time类所取代,并通过JSR 310得到了一致的采用。请参见我的答案中的示例代码。 - Basil Bourque