当前位置:首页 > 技术 > 正文内容

Java 日期时间友好化显示:PrettyTime 开源库的实践

访客 技术 2026年10月11日 6

在 Java 应用开发中,处理日期时间格式化是一项常见需求,但往往涉及复杂的逻辑,尤其是在需要将时间转换为"几分钟前"、"几天后"这类社交风格的表述时。PrettyTime 是一个专为 Java 设计的开源时间格式化工具库,它能将 java.util.Date 或 Java 8+ 的时间 API 对象转换为用户易读的相对时间字符串,极大地简化了开发工作。

PrettyTime 的核心优势

PrettyTime 之所以广受欢迎,得益于其以下强大特性:

  1. 直观的相对时间显示:无需繁琐配置,即可将日期时间智能格式化为"刚刚"、"10分钟前"、"2小时后"等自然语言描述,显著提升用户体验。
  2. 全面的国际化支持:内置超过40种语言的本地化资源,包括简体中文、英文、日文、法文等主流语言,轻松应对国际化项目的需求。这些语言资源文件通常位于 core/src/main/java/org/ocpsoft/prettytime/i18n/ 路径下。
  3. 灵活的时间单位处理:支持从毫秒到千年的宽泛时间单位,覆盖毫秒、秒、分钟、小时、天、周、月、年、十年、世纪乃至千年,满足不同粒度的时间计算与显示场景。
  4. 简洁易用的 API:提供直观的方法调用接口,让开发者能够以极少的代码完成复杂的时间格式化任务,提高开发效率。

快速入门:PrettyTime 的基本用法

基本格式化示例

使用 PrettyTime 库对日期进行格式化非常简单,只需创建实例并调用 format 方法:

import org.ocpsoft.prettytime.PrettyTime;
import java.util.Date;
import java.util.concurrent.TimeUnit; // 用于代码可读性

public class TimeFormatterDemo {
    public static void main(String[] args) {
        // 实例化 PrettyTime
        PrettyTime formatter = new PrettyTime();

        // 格式化当前时间
        System.out.println("当前时间: " + formatter.format(new Date()));
        // 输出示例: "刚刚" 或 "moments ago" (取决于默认语言环境)

        // 格式化过去的某个时间点 (例如:10分钟前)
        Date tenMinutesPast = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10));
        System.out.println("10分钟前: " + formatter.format(tenMinutesPast));
        // 输出示例: "10分钟前"

        // 格式化未来的某个时间点 (例如:2小时后)
        Date twoHoursFuture = new Date(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2));
        System.out.println("2小时后: " + formatter.format(twoHoursFuture));
        // 输出示例: "2小时后"
    }
}

指定语言环境

通过在构造函数中传入 Locale 对象,可以轻松实现多语言的时间显示:

import org.ocpsoft.prettytime.PrettyTime;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class LocaleFormatterDemo {
    public static void main(String[] args) {
        // 使用简体中文环境
        PrettyTime cnFormatter = new PrettyTime(Locale.CHINA);
        Date oneDayAgo = new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1));
        System.out.println("中文显示 (1天前): " + cnFormatter.format(oneDayAgo));
        // 输出示例: "1天前"

        // 使用美国英语环境
        PrettyTime usFormatter = new PrettyTime(Locale.US);
        System.out.println("英文显示 (1天前): " + usFormatter.format(oneDayAgo));
        // 输出示例: "1 day ago"
    }
}

集成 PrettyTime 到您的项目

Maven 项目

在 Maven 项目的 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.ocpsoft.prettytime</groupId>
    <artifactId>prettytime</artifactId>
    <version>5.0.2.Final</version> <!-- 请检查并使用最新稳定版本 -->
</dependency>

高级功能与用法

1. 自定义时间参考点

默认情况下,PrettyTime 以当前系统时间作为参考点。您也可以设置一个特定的 Date 对象作为时间计算的基准:

import org.ocpsoft.prettytime.PrettyTime;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class CustomReferenceDemo {
    public static void main(String[] args) {
        // 设定参考时间为一天前
        Date referencePoint = new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1));
        PrettyTime customPt = new PrettyTime(referencePoint);

        // 格式化一个两天前的时间,相对于参考点 (一天前)
        Date targetDate = new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(2));
        System.out.println("相对于参考点的格式化: " + customPt.format(targetDate));
        // 输出示例: "1天前" (因为目标时间比参考时间早一天)
    }
}

2. 获取精确的时间差分解

除了生成自然语言描述,PrettyTime 还能提供时间差的详细分解(如"4天30分钟前"):

import org.ocpsoft.prettytime.PrettyTime;
import org.ocpsoft.prettytime.Duration;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class PreciseDurationDemo {
    public static void main(String[] args) {
        PrettyTime formatter = new PrettyTime();
        // 目标时间:大约5天前,但精确到分钟
        long fiveDaysMinusThirtyMinsMs = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(5) + TimeUnit.MINUTES.toMillis(30);
        Date detailedTarget = new Date(fiveDaysMinusThirtyMinsMs);

        List<Duration> durations = formatter.calculatePreciseDuration(detailedTarget);
        System.out.println("精确时间差分解: " + formatter.format(durations));
        // 输出示例: "4天 23小时 30分钟前" (或近似值)
    }
}

3. 支持 Java 8 时间 API

PrettyTime 完全兼容 Java 8 及更高版本引入的 java.time 包中的日期时间 API,如 LocalDateTime、Instant 等:

import org.ocpsoft.prettytime.PrettyTime;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit; // 用于代码可读性

public class Java8TimeAPIDemo {
    public static void main(String[] args) {
        PrettyTime formatter = new PrettyTime();

        // 使用 LocalDateTime 格式化 3 小时前的时间
        LocalDateTime threeHoursEarlier = LocalDateTime.now().minus(3, ChronoUnit.HOURS);
        System.out.println("Java 8 时间API格式化 (3小时前): " + formatter.format(threeHoursEarlier));
        // 输出示例: "3小时前"
    }
}

PrettyTime 库的内部结构

PrettyTime 采用模块化设计,主要组件包括:

  • 核心模块 (core/src/main/java/org/ocpsoft/prettytime/):
    • PrettyTime.java:主入口类,提供核心的时间格式化功能。
    • Duration.java:封装时间差计算结果的类。
    • TimeUnit.java:定义了不同时间单位的接口。
  • 时间单位实现 (core/src/main/java/org/ocpsoft/prettytime/units/):包含了各种具体时间单位的实现,例如 Day.java、Hour.java、Month.java 等。
  • 国际化资源 (core/src/main/java/org/ocpsoft/prettytime/i18n/):存储了不同语言的本地化资源文件,如 Resources_zh.java (中文)、Resources_en.java (英文) 等。
  • 扩展模块:还包含针对特定框架的集成,例如 JSF 转换器、JSTL 标签以及 NLP 解析模块等。
标签: JavaPrettyTime

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。