如何计算当前日期和字符串文本日期之间的小时数

时间:2019-10-10 21:17:27

标签: java android simpledateformat android-date

我从服务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();
}

4 个答案:

答案 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)

java.time和ThreeTenABP

这将在您的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)。与较旧且设计较差的DateSimpleDateFormat相比,使用它要好得多。一方面,解析小写的ampm需要更多的代码行(因为在美国语言环境中它们通常是大写的),另一方面java.time的验证更加严格,这始终是好的。我们免费获得的优势包括:我们不需要时区转换,我们可以在中部时间进行所有操作。内置了小时差的计算,只需要一个方法调用即可。

为格式化程序指定语言环境,否则有一天当您的代码在具有非英语默认语言环境的JVM上运行时,它将中断。将美国中部时间指定为美国/芝加哥。对于时区,请始终使用此 region / city 格式。由于CST在一年的这个时候为您提供CDT,因此已弃用CST。

问题:java.time是否不需要Android API级别26或更高?

java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android上,使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接