java - 获取字符串格式的相对日期时间

标签 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 日

最佳答案

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 standards并作为 JSR-310 implementation 的一部分随 Java-8 一起引入。 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

Trail: Date Time 了解有关现代日期时间 API 的更多信息

关于java - 获取字符串格式的相对日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66824028/

相关文章:

sql - 从字符串转换日期和/或时间时转换失败

datetime - 确定两个日期范围是否重叠

c# - 如何获取给定日期的N个月后同一天和同一周的日期

android - IllegalAccessException : can not access a member of class com. android.build.gradle.tasks.ManifestProcessorTask

kotlin - 是否有标准的 Kotlin 函数可以返回没有给定索引处的项目的列表?

java - 如何将 Spring 依赖项注入(inject)到消息驱动 EJB 中?

Java 7,try 和 catch 问题? Ubuntu Eclipse IDE

java - 不支持的 major.minor 版本 51.0,但所有内容都设置为 JDK 1.6

JavaFX 可重用 FXML 片段

android - 任务 ':app:mergeLibDexDebug' 执行失败