以字符串格式获取相对日期时间

时间:2021-03-26 20:38:28

标签: java datetime kotlin

如何获取长时间的相对时间,例如“12小时前”,如这张图片中突出显示的文字

enter image description here

val relative = DateUtils.getRelativeTimeSpanString(1616782398.0.toLong())
Log.d("Debug Elapsed", relative.toString())

我尝试为此使用 DateUtils,但不起作用,因为结果是 1970 年 1 月 19 日

2 个答案:

答案 0 :(得分:2)

Instant#ofEpochSecond

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochSecond(1616782398L);
        System.out.println(instant);
    }
}

输出:

2021-03-26T18:13:18Z

您可以将 Instant 转换为其他类型,例如

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochSecond(1616782398L);

        // Replace ZoneId as applicable e.g. ZoneId.of("Europe/London")
        ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());

        // Print ZonedDateTime#toString
        System.out.println(zdt);

        // Print custom format
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE dd, MMMM uuuu hh:mm:ss a z", Locale.ENGLISH);
        System.out.println(dtf.format(zdt));
    }
}

输出:

2021-03-26T18:13:18Z[Europe/London]
Fri 26, March 2021 06:13:18 PM GMT

如果您正在寻找两个 Instant 之间的持续时间,您可以使用 java.time.Duration 找到它,该 ISO-8601 standardsJSR-310 implementation 为模型并由 Java-8 引入 em> 作为 Trail: Date Time 的一部分。 Java-9 引入了一些更方便的方法。

演示:

import java.time.Duration;
import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        // Instant derived from the given epoch seconds
        Instant instant = Instant.ofEpochSecond(1616782398L);

        // The current instant
        Instant now = Instant.now();

        // Duration between the two instants
        Duration duration = Duration.between(instant, now);

        // Print Duration#toString
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedElapsedTime = String.format(
                "%d Day %02d Hour %02d Minute %02d Second %d Millisecond %d Nanosecond", duration.toDays(),
                duration.toHours() % 24, duration.toMinutes() % 60, duration.toSeconds() % 60,
                duration.toMillis() % 1000, duration.toNanos() % 1000000000L);
        System.out.println(formattedElapsedTime);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedElapsedTime = String.format("%d Day %02d Hour %02d Minute %02d Second %d Millisecond %d Nanosecond",
                duration.toDaysPart(), duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart(),
                duration.toMillisPart(), duration.toNanosPart());
        System.out.println(formattedElapsedTime);
        // ##############################################################################
    }
}

示例运行:

PT2H44M15.040731S
0 Day 02 Hour 44 Minute 15 Second 40 Millisecond 40731000 Nanosecond
0 Day 02 Hour 44 Minute 15 Second 40 Millisecond 40731000 Nanosecond

{{3}} 了解有关现代日期时间 API 的更多信息。

答案 1 :(得分:1)

我不知道 DateUtil 是什么,但您可以简单地使用 java.time.InstantDuration

import java.time.Duration;
import java.time.Instant;

public class Main {
   public static void main(String[] args) {
      Instant now = Instant.now();
      Instant instant = Instant.ofEpochMilli(1616782398);
      Duration d = Duration.between(now, instant);
      System.out.println(d);
   }
}

然后您可以使用 get 上的 Duration 方法来检索所需的值并根据需要对其进行格式化。

作为替代方案,您可以像这样使用 ChronoUnit 来获得类似的结果:

ChronoUnit.HOURS.between(now, instant)