# JodaTime_ohos **Repository Path**: isrc_ohos/joda-time_ohos ## Basic Information - **Project Name**: JodaTime_ohos - **Description**: 鸿蒙日期和时间处理库 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 76 - **Forks**: 2 - **Created**: 2021-02-04 - **Last Updated**: 2025-09-02 ## Categories & Tags **Categories**: harmony **Tags**: HarmonyComponent ## README # JodaTime_ohos **本项目是基于开源项目 JodaTime 进行鸿蒙化的移植和开发的,可以通过项目标签以及github地址( https://github.com/dlew/joda-time-android )追踪到原安卓项目版本** #### 项目介绍 - 项目名称:日期和时间处理库 - 所属系列:鸿蒙的第三方组件适配移植 - 功能:处理日期和时间 - 项目移植状态:完成 - 调用差异:无 - 开发版本:sdk5,DevEco Studio2.1 beta3 - 项目发起作者:陈丛笑 - 邮箱:isrc_hm@iscas.ac.cn - 原项目Doc地址:https://github.com/dlew/joda-time-android #### 项目介绍 - 编程语言:Java - 外部库依赖:org.jar 在Java中处理日期和时间是很常见的需求,基础的工具类就是我们熟悉的Date和Calendar,然而这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的库。 #### 安装教程 1. 下载JodaTime的jar包JodaTime.jar。 2. 启动 DevEco Studio,将下载的jar包,导入工程目录“entry->libs”下。 3. 在moudle级别下的build.gradle文件中添加依赖,在dependences标签中增加对libs目录下jar包的引用。 ``` dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.har']) …… } ``` 4. 在导入的jar包上点击右键,选择“Add as Library”对包进行引用,选择需要引用的模块,并点击“OK”即引用成功。 在sdk5,DevEco Studio2.1 beta3下项目可直接运行 如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件, 并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 #### 使用说明 1. 使用最多的五个日期时间类: - Instant - 不可变的类,用来表示时间轴上一个瞬时的点(时间戳) - DateTime - 不可变的类,用来替换JDK的Calendar类 - LocalDate - 不可变的类,表示一个本地的日期,而不包含时间部分(没有时区信息) - LocalTime - 不可变的类,表示一个本地的时间,而不包含日期部分(没有时区信息) - LocalDateTime - 不可变的类,表示一个本地的日期-时间(没有时区信息) 2.使用实例 初始sample的构建 ``` public class sampleDateRangeslice extends AbilitySlice { private DirectionalLayout directionalLayout = new DirectionalLayout(this);//初始化layout private DirectionalLayout.LayoutConfig layoutConfigD = new DirectionalLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT);//设置layout参数 @Override protected void onStart(Intent intent) { super.onStart(intent); directionalLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT); directionalLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT); directionalLayout.setPadding(32, 32, 80, 80);//设置间距 ShapeElement element = new ShapeElement();//初始化button背景 element.setRgbColor(new RgbColor(255, 255, 255)); directionalLayout.setBackground(element); Text welcome = new Text(this);//初始化欢迎标题 welcome.setLayoutConfig(layoutConfigD); welcome.setText("sampleDateRange测试结果:"); welcome.setTextSize(85); welcome.setTextColor(Color.RED); welcome.setMultipleLine(true); directionalLayout.addComponent(welcome); sampleDateRange(); super.setUIContent(directionalLayout);//应用layout } private void addSample(CharSequence title, Iterable text) {//定义测试sample addSample(title, join("\n",text)); } public static String join( CharSequence delimiter, Iterable tokens) {//定义字符串的链接 final Iterator it = tokens.iterator(); if (!it.hasNext()) { return ""; } final StringBuilder sb = new StringBuilder(); sb.append(it.next()); while (it.hasNext()) { sb.append(delimiter); sb.append(it.next()); } return sb.toString(); } private void addSample(CharSequence title, CharSequence text) {//定义测试sample主体 Text titleText = new Text(this); titleText.setLayoutConfig(layoutConfigD); titleText.setText((String) title); titleText.setTextColor(Color.BLUE); titleText.setTextSize(75); titleText.setMultipleLine(true); Text textT = new Text(this); textT.setLayoutConfig(layoutConfigD); textT.setText((String) text); textT.setTextSize(70); textT.setMultipleLine(true); directionalLayout.addComponent(titleText); directionalLayout.addComponent(textT); } ``` 3:标准时间类的使用 ``` private void sampleDateTime() { List text = new ArrayList(); DateTime now = DateTime.now(); text.add("Now: " + now); text.add("Now + 30 minutes: " + now.plusMinutes(30)); text.add("Now + 5 hours: " + now.plusHours(5)); text.add("Now + 2 days: " + now.plusDays(2)+"\n\n"); addSample("DateTime", text); } ``` 4:格式化时间类的使用 ``` private void sampleFormatDateTime() { List text = new ArrayList(); DateTime now = DateTime.now(); text.add("Show time: " + DateUtils.formatDateTime(this, now, FORMAT_SHOW_TIME)); text.add("Show date: " + DateUtils.formatDateTime(this, now, FORMAT_SHOW_DATE)); text.add("Numeric date: " + DateUtils.formatDateTime(this, now, FORMAT_NUMERIC_DATE)); text.add("Show date (abbreviated): " + DateUtils.formatDateTime(this, now, FORMAT_ABBREV_ALL)); addSample("DateUtils.formatDateTime()", text); } ``` 5:格式化一段时间的表示使用 ``` private void sampleFormatDuration() throws IOException, NotExistException, WrongTypeException { List text = new ArrayList(); text.add("Seconds: " + DateUtils.formatDuration(this, Duration.standardSeconds(25))); text.add("Minutes: " + DateUtils.formatDuration(this, Duration.standardMinutes(5))); text.add("Hours: " + DateUtils.formatDuration(this, Duration.standardHours(3))); addSample("DateUtils.formatDuration()", text); } ``` 6:相对时间的表示 ``` private void sampleGetRelativeDateTimeString() throws NotExistException, WrongTypeException, IOException { List text = new ArrayList(); DateTime now = DateTime.now(); text.add("Short future: " + DateUtils.getRelativeDateTimeString(this, now.plusMinutes(25), null, 0)); text.add("Medium future: " + DateUtils.getRelativeDateTimeString(this, now.plusHours(5), null, 0)); text.add("Long future: " + DateUtils.getRelativeDateTimeString(this, now.plusDays(3), null, 0)); text.add("Short past: " + DateUtils.getRelativeDateTimeString(this, now.minusMinutes(25), null, 0)); text.add("Medium past: " + DateUtils.getRelativeDateTimeString(this, now.minusHours(5), null, 0)); text.add("Long past: " + DateUtils.getRelativeDateTimeString(this, now.minusDays(3), null, 0)); addSample("DateUtils.getRelativeDateTimeString()", text); } ``` 7:显示一段时间的相对表示 ``` private void sampleGetRelativeTimeSpanString() throws NotExistException, WrongTypeException, IOException { List text = new ArrayList(); DateTime now = DateTime.now(); text.add("Short future: " + DateUtils.getRelativeTimeSpanString(this, now.plusMinutes(25))); text.add("Medium future: " + DateUtils.getRelativeTimeSpanString(this, now.plusHours(5))); text.add("Long future: " + DateUtils.getRelativeTimeSpanString(this, now.plusDays(3))); text.add("Short past: " + DateUtils.getRelativeTimeSpanString(this, now.minusMinutes(25))); text.add("Medium past: " + DateUtils.getRelativeTimeSpanString(this, now.minusHours(5))); text.add("Long past: " + DateUtils.getRelativeTimeSpanString(this, now.minusDays(3))); addSample("DateUtils.getRelativeTimeSpanString()", text); } ``` 8:显示一段时间的相对的字符串表示 ``` private void sampleGetRelativeTimeSpanStringWithPreposition() throws NotExistException, WrongTypeException, IOException { List text = new ArrayList(); DateTime now = DateTime.now(); text.add("Short future: " + DateUtils.getRelativeTimeSpanString(this, now.plusMinutes(25), true)); text.add("Medium future: " + DateUtils.getRelativeTimeSpanString(this, now.plusHours(5), true)); text.add("Long future: " + DateUtils.getRelativeTimeSpanString(this, now.plusDays(3), true)); text.add("Short past: " + DateUtils.getRelativeTimeSpanString(this, now.minusMinutes(25), true)); text.add("Medium past: " + DateUtils.getRelativeTimeSpanString(this, now.minusHours(5), true)); text.add("Long past: " + DateUtils.getRelativeTimeSpanString(this, now.minusDays(3), true)); addSample("DateUtils.getRelativeTimeSpanString() (with preposition)", text); } ``` 9:测试是否是今天 ``` private void sampleIsToday() { List text = new ArrayList(); LocalDate today = LocalDate.now(); text.add("Today: " + DateUtils.isToday(today)); text.add("Tomorrow: " + DateUtils.isToday(today.plusDays(1))); text.add("Yesterday: " + DateUtils.isToday(today.minusDays(1))); addSample("DateUtils.isToday()", text); } ``` 10:当前时间的表示 ``` private void sampleLocalDate() { List text = new ArrayList(); LocalDate now = LocalDate.now(); text.add("Now: " + now); text.add("Now + 2 days: " + now.plusDays(2)); text.add("Now + 3 months: " + now.plusMonths(3)); addSample("LocalDate", text); } ``` #### 版本迭代 - v0.1.0-alpha #### 版权和许可信息 - JodaTime_ohos经过[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0)授权许可。