我从服务2 Nov 2019 07:30 pm
获取一个字符串,日期在United States Central Time
中。
现在我需要知道当前时间和这个日期之间还剩下多少时间。
我正在使用以下代码,但这并不能给出准确的区别。
SimpleDateFormat ticketDateFormat = new SimpleDateFormat("MMM d yyyy hh:mm a");
Date parsedDate= null;
try {
parsedDate= ticketDateFormat.parse(dateTimeString);
DateFormat formatter = new SimpleDateFormat("MMM d yyyy hh:mm a");
TimeZone timeZone = TimeZone.getTimeZone("CST");
formatter.setTimeZone(timeZone);
parsedDate= ticketDateFormat.parse(formatter.format(parsedDate));
long totalTimeRemainingInMillis= Math.abs(currentDateTime.getTime()- (parsedDate.getTime()));
long diffInHours = TimeUnit.MILLISECONDS.toHours(totalTimeRemainingInMillis);
} catch (ParseException e) {
e.printStackTrace();
}
答案 0 :(得分:1)
尽管在您的问题中不清楚从何处获取当前时间,但我的猜测是问题出在您使用TimeZone的方式上。您是在格式化程序中设置TimeZone,然后解析您所说的CST中已经存在的日期。
这是您可以执行相同操作然后比较结果的另一种方法:
LocalDateTime dateTime = LocalDateTime.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("LLL d yyyy hh:mm a");
LocalDateTime parse = LocalDateTime.parse("Nov 2 2019 07:30 PM", fmt);
System.out.println(Duration.between(dateTime, parse).toHours());
答案 1 :(得分:0)
字符串日期“ 2019年11月2日晚上7:30”应采用以下方式解析:
new SimpleDateFormat("dd MMM yyyy hh:mm a")
不是这样的:
new SimpleDateFormat("MMM d yyyy hh:mm a");
答案 2 :(得分:0)
对结果使用以下代码
{{1}}
答案 3 :(得分:0)
这将在您的Android API级别上起作用:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("d MMM uuuu hh:mm ")
.parseCaseInsensitive()
.appendPattern("a")
.toFormatter(Locale.US);
ZoneId zone = ZoneId.of("America/Chicago");
ZonedDateTime currentDateTime = ZonedDateTime.now(zone);
String dateTimeString = "2 Nov 2019 07:30 pm";
ZonedDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter)
.atZone(zone);
long diffInHours = ChronoUnit.HOURS.between(currentDateTime, dateTime);
System.out.println("Difference in hours: " + diffInHours);
我刚才运行此代码段时,输出为:
小时差异:541
我正在使用java.time(现代Java日期和时间API)。与较旧且设计较差的Date
和SimpleDateFormat
相比,使用它要好得多。一方面,解析小写的am
和pm
需要更多的代码行(因为在美国语言环境中它们通常是大写的),另一方面java.time的验证更加严格,这始终是好的。我们免费获得的优势包括:我们不需要时区转换,我们可以在中部时间进行所有操作。内置了小时差的计算,只需要一个方法调用即可。
为格式化程序指定语言环境,否则有一天当您的代码在具有非英语默认语言环境的JVM上运行时,它将中断。将美国中部时间指定为美国/芝加哥。对于时区,请始终使用此 region / city 格式。由于CST在一年的这个时候为您提供CDT,因此已弃用CST。
java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。