在java中日期时间处理是很常见的需求,基础工具类提供Date和Calendar类,但使用起来并不方便,于是诞生了Joda-Time日期时间处理专用库,虽然Java 8中新增java.time处理日期时间,但仍需Threeten第三方库弥补Java 8的不足。
1、选择工具库的考量依据
(1)、功能是否全面,能够满足生产需要,并能解决该领域中的绝大多数的问题;
(2)、是否是主流工具,用的人越多,意味着该库经受了更多生产实践的验证,效率安全等方面都已被证明是可靠的;
(3)、自己是否已经熟练掌握。会的多不如会的精,如果能够用一个工具快速熟练可靠地解决问题,在时间成本有限的情况下,就不用刻意追求学习其它可替代的库。
2、常用的date-time类
Instant - 不可变的类,用来表示时间轴上一个瞬时的点;
DateTime - 不可变的类,用来替换JDK的Calendar类;
LocalDate - 不可变的类,表示一个本地的日期,而不包含时间部分(没有时区信息);
LocalTime - 不可变的类,表示一个本地的时间,而不包含日期部分(没有时区信息);
LocalDateTime - 不可变的类,表示一个本地的日期-时间(没有时区信息);
注意:不可变的类,表明了正如Java的String类型一样,其对象是不可变的。即不论对它进行怎样的改变操作,返回的对象都是新对象。
3、DateTime类
3.1、构造一个DateTime实例
DateTime():这会创建一个在当前系统所在时区的当前时间,精确到毫秒;
DateTime(int year, int monthOfYear, int dayOfMonth, int hourOfDay, int minuteOfHour, int secondOfMinute):构造一个指定的时间,这里精确到秒;
DateTime(long instant):这个构造方法创建出来的实例,是通过一个long类型的时间戳,它表示这个时间戳距1970-01-01T00:00:00Z的毫秒数。使用默认的时区;
DateTime(Object instant):通过一个Object对象构造一个实例。这个Object对象可以是ReadableInstant, String, Calendar和Date。其中String的格式需要是ISO8601格式。
3.2、访问DateTime实例
(1)、with开头的方法用来设置DateTime实例到某个时间,示例如下:
DateTime dateTimeNow = new DateTime();
DateTime dateTime = dateTimeNow.withYear(2018);
(2)、plus/minus开头的方法用来返回在DateTime实例上增加或减少一段时间后的实例,示例如下:
DateTime now = new DateTime();
DateTime tomorrow = now.plusDays(1);
DateTime lastMonth = now.minusMonths(1);
(3)、返回Property的方法
Property中get开头的方法获取一些有用的信息,示例如下:
DateTime now = new DateTime(); // 2016-02-26T16:51:28.749+08:00
now.monthOfYear().getAsText(); // February
now.monthOfYear().getAsText(Locale.KOREAN); // 2월
now.dayOfWeek().getAsShortText(); // Fri
now.dayOfWeek().getAsShortText(Locale.CHINESE); // 星期五
Property中round开头的方法置零操作,示例如下:
DateTime now = new DateTime(); // 2016-02-26T16:51:28.749+08:00
now.dayOfWeek().roundCeilingCopy(); // 2016-02-27T00:00:00.000+08:00
now.dayOfWeek().roundFloorCopy(); // 2016-02-26T00:00:00.000+08:00
now.minuteOfDay().roundFloorCopy(); // 2016-02-26T16:51:00.000+08:00
now.secondOfMinute().roundFloorCopy(); // 2016-02-26T16:51:28.000+08:00
3.3、日历系统和时区
(1)、Joda-Time默认使用的是ISO的日历系统,而ISO的日历系统是世界上公历的事实标准。然而,ISO日历系统在表示1583年之前的历史时间是不精确的;
(2)、Joda-Time默认使用的是JDK的时区设置。如果需要的话,这个默认值是可以被覆盖的;
(3)、Joda-Time使用可插拔的机制来设计日历系统,而JDK则是使用子类的设计,下面示例用于获得一个Joda-Time chronology在东京的时区
DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo");
Chronology gregorianJuian = GJChronology.getInstance(zone);
3.4、Interval和Period
Interval:它保存了一个开始时刻和一个结束时刻,因此能够表示一段时间,并进行这段时间的相应操作;
Period:它保存了一段时间,比如:6个月,3天,7小时这样的概念。可以直接创建Period,或者从Interval对象构建;
Duration:它保存了一个精确的毫秒数。同样地,可以直接创建Duration,也可以从Interval对象构建;
这三个类都用来表示时间段,但是在用途上、语义上、精度上有一些差别;
DateTime dt = new DateTime(2005, 3, 26, 12, 0, 0, 0);
DateTime plusPeriod = dt.plus(Period.days(1));
DateTime plusDuration = dt.plus(new Duration(24L*60L*60L*1000L));
4、maven依赖
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.2</version>
</dependency>
相关文章
- 03-25蓝桥杯c++算法学习【1】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷例题!!!)- 对于一个8位数的整型日期,可以通过除法和取余运算来获取它的每一位数字。比如: 若整数date 的值为20050511,它从高到低的每一数位上的数可以通过下列方法得到。 • data / 10000000 = 2; • data / 1000000 % 10 = 0; • data / 100000 % 10 = 0; • data / 10000 % 10 = 5; • data / 1000 % 10 = 0; • data / 100 % 10 = 5; • data / 10 % 10 = 1; • data % 10 = 1。 对于本题,若用a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8] 分别存储每一位,则一个 回文日期须满足: 一个ABABBABA 型回文日期须满足以下条件。 a[1] = a[3] = a[6] = a[8];a[2] = a[4] = a[5] = a[7]. 对于一个日期字符串,可以直接通过下标来获取它的每一位数字。例如,string date = “20050511”,它从高到低的每一位分别可以通过data[0],data[1],...,data[7] 得到。判断回文日期及ABABBABA型回文日期的方式和上述方法类似。 不难看出,字符串获取日期的每一位数字是要比整型简单的,所以在判断回文日期及 ABABBABA 型回文日期时可以将整型转换为字符串来操作,如参考代码所示。 #include <bits/stdc++.h> using namespace std; int date = 20050511; string s = to_string(date); // 将整型转换为字符串, s = "20050511" // 判断回文日期 bool check1(int date) { string s = to_string(date); if (s[0] == s[7] && s[1] == s[6] && s[2] == s[5] && s[3] == s[4]) return true; return false; } // 判断 ABABBABA 型回文日期 bool check2(int date) { string s = to_string(date); if (s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && s[1] == s[3] && s[1] == s[4] && s[1] == s[6]) return true; return false; } 2. 如何枚举日期 对于一个整型日期,可以用最简单的方式枚举,即令该日期不断+1,直到出现满足ABAB BABA 型的回文日期。 但这样存在一个问题:会枚举出许多不合法的日期(如20209999)。为此,我们需要对 日期进行合法性判断:设y,m,d分别表示年、月、日,month[i]表示第i个月的天数,那么当m12或dmonth[m]时日期不合法,反之日期合法,如参考代码所示。 #include <iostream> #include <string> using namespace std; int month[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool check(int date) { string s = to_string(date); //stoi->将字符串转为整型 int y = stoi(s.substr(0, 4)), m = stoi(s.substr(4, 2)), d = stoi(s.substr(6, 2)); if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) month[2] = 29; else month[2] = 28; if (m < 1 || m > 12 || d < 1 || d > month[m]) return false; return true; } int main { int date = 20050511; for (int i = date + 1;; i++) { if (!check(i)) continue; // 找到下一个有效日期后,可以在这里进行进一步处理 // 例如,检查是否是回文日期或 ABABBABA 型回文日期 cout << "Next valid date: " << i << endl; break; } return 0; } 不过这样的枚举量是相当大的,要在比赛中完成本题要求的所有测试数据不太现实。 那么,还有什么枚举方法呢? 可以直接枚举合法日期。枚举合法日期只需模拟日期的变化规律即可,对应参考代码如 下所示。 #include <iostream> using namespace std; int month[13] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int main { int date = 20050511; int y = date / 10000, m = date / 100 % 100, d = date % 100; for (int i = y;; i++) { if (i % 400 == 0 || (i % 100 != 0 && i % 4 == 0)) month[2] = 29; // 闰年2月有29天 else month[2] = 28; int j = (i == y) ? m : 1; // 如果是i = y,则月份从m开始枚举,否则从1开始枚举 for (; j <= 12; j++) { int k = (i == y && j == m) ? d : 1; // 如果i = y并且j = m,则日从d开始枚举,否则从1开始枚举 for (; k <= month[j]; k++) { int new_date = i * 10000 + j * 100 + k; // 在这里可以进行进一步处理,例如检查是否是回文日期或ABABBABA型回文日期 cout << "Next valid date: " << new_date << endl; return 0; // 找到第一个有效日期后退出程序 } } } return 0; } 综上 :
- 03-25人工智能理论之opencv图像预处理、数据库、GUI布局的综合应用(图像预处理版块)-总结
- 03-2510月22日纯血鸿蒙正式版发布意味着什么?-应用管控中心:鸿蒙系统提供了应用管控中心,能够智能识别应用的风险行为,并给出将其放入应用管控中心的提示,以便在更安全可控的环境下调用。对于被加入管控的应用,系统会通过空白信息、模糊定位等方式隐藏或禁用真实敏感的用户数据,并限制应用弹框,确保应用在安全受控的前提下正常运行。 隐私保护功能:鸿蒙系统提供了图片隐私保护功能,可以在分享照片时去除图片的位置信息和拍摄数据。此外,还有AI隐私保护功能,可以自动识别并一键打码身份证、银行卡号、车票信息、头像昵称等敏感信息,防止隐私泄露。 系统级文件加密分享:鸿蒙系统支持系统级的文件加密分享机制,用户可以在手机或平板上对文件进行加密,只有授权的用户才能打开,这种系统级的分享机制不依赖应用,不限分享渠道,并支持多种文件类型。 安全认证:鸿蒙系统的安全能力获得了行业最高等级的安全认证,鸿蒙内核获得了国际CC EAL6+证书,这是业界通用操作系统内核领域首个6+等级认证。整个系统还获得了中国CCRC EAL5+认证,是业界唯一获得此认证的操作系统。 隐私灯功能:鸿蒙系统推出了全新的隐私灯功能,能在状态栏明确提示用户当前有应用正在使用麦克风、摄像头或地理位置,并能做到全局的实时显示,有效防止被应用覆盖,确保用户能够实时了解应用正在使用的敏感权限。 应用权限管理:鸿蒙系统全面梳理了所有系统授权,禁止开放了9类不合理权限,包括读取已安装应用列表、访问短信、访问存储文件等,确保应用只能访问特定权限,保护用户数据的安全和私密性。 分布式架构:鸿蒙系统的分布式架构支持多种设备间的无缝协作,允许手机轻松连接到其他设备,实现资源共享和跨设备的任务处理,同时确保了数据在不同设备间的安全传输。 微内核设计:鸿蒙系统采用微内核设计,有效防止了外部攻击,并且通过形式化方法,重塑可信安全,提供更强的安全特性和低时延等特点。 数据生命周期保护:鸿蒙系统参照数据的风险分级,提供了基于全生命周期的数据保护能力,包括数据的生成、存储、使用、传输和销毁等阶段,确保数据在各个阶段的安全。 以上这些特性共同构成了鸿蒙系统在安全和隐私保护方面的全面策略,为用户提供一个安全可靠的操作系统环境。 鸿蒙系统惊人的迭代速度 从官网鸿蒙文档的发布可以看出,纯血鸿蒙NEXT在6月份面向开发者发布 Beta1版本以来,短短4个月时间,经过6个Beta 版的迭代,到昨天发布会正式发布,V 哥从文档日期看到,HarmonyOS NEXT Release 版,更新于2024-10-18 17:16。 正式版的发布,为首款搭载纯血鸿蒙 NEXT 手机 Mate70的发布提前奠定了基础,让我们一起期待12月份里程碑式的发布会。 鸿蒙系统是智能时代的基础 当下,我们正面临第四次工业革命的进程,从第一次以蒸汽机为首的机器取代人力生产的机械制造时代,到第二次以电力大规模应用为代表的电气化和自动化时代,再到第三次以计算机和电子数据普及为代表的电子信息时代,我们都在学习和模仿,这一次的智能时代来了,鸿蒙系统将发挥着重要的基础能力。智能设备和产品,就得依托智能底座系统。 虽然说从诺基亚手机的塞班系统开始就称之为智能手机系统,随着iPhone的横空出世,和Android系统生态的发展,智能操作系统才真正被称为智能。而鸿蒙 NEXT,又重新定义了什么是智能操作系统,听 V 哥慢慢道来。 iOS 和 Android 都是为单一设备设计的操作系统,它们的内核和系统架构主要针对手机、平板等移动设备进行优化。所以我们会看到例如 iOS的应用有手机版,pad版多套应用,这无疑给企业开发增加而外的工作量。 再一个,虽然 iOS 和 Android 支持多任务和后台处理,但它们并不是为跨设备协作设计的分布式系统。在多设备协同工作方面,它们主要依赖于云服务和第三方应用来实现。 而鸿蒙 NEXT 系统(HarmonyOS NEXT)是一个分布式操作系统,它支持多种设备之间的无缝协作,实现了真正的分布式架构。鸿蒙系统通过微内核设计,提供了更好的性能和安全性,同时支持跨设备的统一操作体验。分布式系统是指由多个独立的计算机组成的系统,这些计算机之间通过网络相互连接,协同工作以完成特定的任务。 所以,在鸿蒙应用开发中,可以真正实现一次开发多端部署的特点。因为鸿蒙系统本身是分布式系统架构。这个特性不简单,随着物联网的发展,除了手机、平板、电视、手表等等这些智能设备,鸿蒙为更多的物联网、泛物联网设备的产生提供了天然的支持,鸿蒙系统可以让这些设备之间实现丝滑的数据流转,为所有智能设备提供了统一的系统级标准,这为智能时代的发展带来无限的可能,手机、平板等不是全部,而是物联网设备中的其中一种而已。 鸿蒙时代必将开启全新的世界。
- 03-25【C语言教程】【常用类库】(六)时间处理库 - <time.h>
- 03-25【JavaScript脚本宇宙】从实用工具到日期处理:深度解析JavaScript库的应用与优势
- 03-25Go 每日一库之 go-carbon,优雅的golang日期时间处理库
- 03-25python 日期 时间处理
- 03-25日期时间处理之Joda-Time库
- 03-25Python : 标准库-时间和日期补充
- 03-25【python数据分析】pandas库之文本处理