Java(二十五)——Java基础类库之日期、时间类

准静态电磁场 叠加法 缺点:对于连续分布的电荷,叠加法的计算比较困难 虚位移法 概念 广义坐标:确实系统中导体形状、尺寸与位置的一组独立几何量。 广义力:企图改变某一广义坐标的力。 功:广义力乘上由它引起的广义坐标的改变量。 公式 ... 阅读详情

Java原本提供了Date和Calendar用于处理日期、时间的类,包括创建日期、时间对象,获取系统当前日期、时间等操作。但Date不仅无法实现国际化,而且它对不同属性也使用了前后矛盾的偏移量,比如月份与小时都是从0开始的,月份中的天数则是从1开始的,年又是从1900开始的,而java.util.Calendar则显得过于复杂,从下面介绍中会看到传统Java对日期、时间处理的不足。Java 8吸取了Joda-Time库(一个被广泛使用的日期、时间库)的经验,提供了一套全新的日期时间库。

一、Date类

Java提供了Date类来处理日期、时间(此处的Date是指java.util包下的Date类,而不是java.sql包下的Date类),Date对象既包含日期,也包含时间。Date类从JDK1.0起就开始存在了,但正因为它历史悠久,所以它的大部分构造器、方法都已经过时,不再推荐使用了。

Date类提供了6个构造器,其中4个已经Deprecated(Java不再推荐使用,使用不再推荐的构造器时编译器会提出警告信息,并导致程序性能、安全性等方面的问题),剩下的两个构造器如下。

  • Date():生成一个代表当前日期时间的Date对象。该构造器在底层调用System.currentTimeMillis()获得long整数作为日期参数。
  • Date(long date):根据指定的long型整数来生成一个Date对象。该构造器的参数表示创建的Date对象和GMT 1970年1月1日 00:00:00之间的时间差,以毫秒作为计时单位。

与Date构造器相同的是,Date对象的大部分方法也Deprecated了,剩下为数不多的几个方法。

  • boolean after(Date when):测试该日期是否在指定日期when之后。
  • boolean before(Date when):测试该日期是否在指定日期when之前。
  • long getTime():返回该时间对应的long型整数,即从GMT 1970年1月1日 00:00:00到该Date对象之间的时间差,以毫秒作为计时单位。
  • void setTime(long time):设置该Date对象的时间。

总体来说,Date是一个设计相当糟糕的类,因此Java官方推荐尽量少用Date的构造器和方法。如果需要对日期、时间进行加减运算,或获取指定时间的年、月、日、时、分、秒信息,可使用Calendar工具类

二、Calendar类

因为Date类在设计上存在一些缺陷,所以Java提供了Calendar类来更好地处理日期和时间。Calendar是一个抽象类,它用于表示日历。

历史上有着许多种纪年方法,它们的差异实在太大了。为了统一计时,全世界通常选择最普及、最通用的日历:Gregorian Calendar,也就是日常介绍年份时常用的“公元几几年”。

Calendar类本身是一个抽象类,它是所有日历类的模板,并提供了一些所有日历通用的方法;但它本身不能直接实例化,程序只能创建Calendar子类的实例,Java本身提供了一个GregorianCalendar类,一个代表格里高利日历的子类,它代表了通常所说的公历。

Calendar类是一个抽象类,所以不能使用构造器来创建Calendar对象。但它提供了几个静态genInstance()方法来获取Calendar对象,这些方法根据TimeZone,Locale类来获取特定的Calendar,如果不指定TimeZone,Locale,则使用默认的TimeZone,Locale来创建Calendar。

Calendar与Date都是表示日期的工具类,他们可以直接自由转换,如下代码所示。

// 创建一个默认的Calendar对象
Calendar calendar = Calendar.getInstance();
// 从Calendar对象中取出Date对象
Date date = calendar.getTime();
// 通过Date对象获得对应的Calendar对象
// 因为Calendar/GregorianCalendar没有构造器函数可以接收Date对象
// 所以必须先获得一个Calendar实例,然后调用其setTime()方法
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date);

Calendar类提供了大量访问、修改日期时间的方法,常用方法如下。

  • void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  • int get(int field):返回指定日历字段的值。
  • int getActualMaximum(int field):返回指定日历字段可能拥有的最大值。例如月,最大值为11。
  • int getActualMinimum(int field):返回指定日历字段可能拥有的最大值。例如月,最小值为0。
  • void roll(int field,int amount):与add()方法类似,区别在于加上amount后超过了该字段所能表示的最大范围时,也不会向上一个字段进位。
  • void set(int field,int value):将给定的日历字段设置为给定值。
  • void set(int year, int month, int date):设置Calendar对象的年、月、日三个字段的值。
  • void set(int year, int month, int date, int hourOfDay, int minute, int second):设置Calendar对象的年、月、日、时、分、秒6个字段的值。

**注意:**上面很多方法都需要一个int类型的field参数,field是Calendar类的类变量,如Calendar.YEAR、Calendar.MONTH等分别代表了年、月、日、小时、分钟、秒等时间字段。需要指出的是,Calendar.MONTH字段代表月份,月份的起始值不是1,而是0,所以要设置8月时,用7而不是8。

Calendar类还有如下几个注意点:
1.add与roll的区别
add(int field, int amount)的功能非常强大,add主要用于改变Calendar的特定字段的值。如果需要增加某字段的值,则让amount为整数;如果需要减少某字段的值,则让amount为负数即可。
add(int field, int amount)有如下两条规则。

  • 当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。例如:
Calendar cal1 = Calendar.getInstance();
cal1.set(2003, 7, 23, 0, 0, 0); // 2003-8-23
cal1.add(MONTH, 6); // 2003-8-23 => 2004-2-23
  • 如果下一级字段也需要改变,那么该字段会修正到变化最小的值。例如:
Calendar cal2 = Calendar.getInstance();
cal2.set(2003, 7, 31, 0, 0, 0); // 2003-8-31
// 因为进位后月份改为2月,2月没有31日,自动变成29日
cal2.add(MONTH, 6); // 2003-8-31 => 2004-2-29

roll()的规则与add()的处理规则不同:当被修改的字段超出它允许的范围时,上一级字段不会增大。

Calendar cal3 = Calendar.getInstance();
cal3.set(2003, 7, 23, 0, 0, 0); // 2003-8-23
cal3.roll(MONTH, 6); // 2003-8-23 => 2003-2-23

下一级字段的处理规则与add()方法相似:

Calendar cal4 = Calendar.getInstance();
cal4.set(2003, 7, 31, 0, 0, 0); // 2003-8-31
// MONTH字段“进位”后变成2, 2月没有31日
// YEAR字段不会改变,2003年2月只有28天
cal4.add(MONTH, 6); // 2003-8-31 => 2003-2-28

2.设置Calendar的容错性
Calendar提供了一个setLenient()用于设置它的容错性,Calendar默认支持较好的容错性,通过setLenient(false)可以关闭Calendar的容错性,让它进行严格的参数检查。
3.set()方法延迟修改
set(f, value)方法将日历字段f更改为value,此外它还设置了一个内部成员变量,以知识日历字段f已经被更改。**尽管日历字段f是立即更改的,但该Calendar所代表的时间却不会立即修改,直到下次调用get()、getTime()、getTimeInMillis()、add()或roll()时才会重新计算日历的时间。**这被称为set()方法的延迟修改,采用延迟修改的优势是多次调用set()不会触发多次不必要的计算(需要计算出一个代表实际时间的long型整数)。
##三、Java 8新增的日期、时间包
Java 8专门新增了一个java.time包,该包下包含了如下常用的类。

  • Clock:该类用于获取指定时区的当前日期、时间。该类可取代System类的currentTimeMillis()方法,而且提供了更多方法来获取当前日期、时间。该类提供了大量静态方法来获取Clock对象。
  • **Duration:**该类代表持续时间。该类可以非常方便地获取一段时间。
  • **Instant:**代表一个具体的时刻,可以精确到纳秒。该类提供了静态的now()方法来获取当前时刻,也提供了静态的now(Clock clock)方法来获取clock对应的时刻。除此之外,它还提供了一系列minusXxx()方法在当前时刻基础上减去一段时间,也提供了plusXxx()方法在当前时刻基础上加上一段时间。
  • **LocalDate:**该类代表不带时区的日期,例如2007-12-03。该类提供了静态的now()方法来获取当前日期,也提供了静态的now(Clock clock)方法来获取clock对应的日期。除此之外,它还提供了一系列minusXxx()方法在当前年份基础上减去几年、几月、几周或几日等,也提供了plusXxx()方法在当前年份基础上加上几年、几月、几周或几日等。
  • **LocalTime:**该类代表不带时区的日期,例如10:15:30。该类提供了静态的now()方法来获取当前时间,也提供了静态的now(Clock clock)方法来获取clock对应的时间。除此之外,它还提供了一系列minusXxx()方法在当前年份基础上减去几小时、几分、几秒等,也提供了plusXxx()方法在当前年份基础上加上几小时、几分、几秒等。
  • **LocalDateTime:**该类代表不带时区的日期、时间,例如2007-12-03T10:15:30。该类提供了静态的now()方法来获取当前日期、时间,也提供了静态的now(Clock clock)方法来获取clock对应的日期、时间。除此之外,它还提供了一系列minusXxx()方法在当前年份基础上减去几年、几月、几日、几小时、几分、几秒等,也提供了plusXxx()方法在当前年份基础上加上几年、几月、几日、几小时、几分、几秒等。
  • **MonthDay:**该类仅代表月日,例如–04-12。该类提供了静态的now()方法来获取当前月日,也提供了静态的now(Clock clock)方法来获取clock对应的月日。
  • **Year:**该类仅代表年,例如2014。该类提供了静态的now()方法来获取当前年份,也提供了静态的now(Clock clock)方法来获取clock对应的年份。除此之外,它还提供了一系列minusXxx()方法在当前年份基础上减去几年,也提供了plusXxx()方法在当前年份基础上加上几年等。
  • **YearMonth:**该类仅代表年月,例如2014-04。该类提供了静态的now()方法来获取当前年月,也提供了静态的now(Clock clock)方法来获取clock对应的年月。除此之外,它还提供了一系列minusXxx()方法在当前年份基础上减去几年、几月,也提供了plusXxx()方法在当前年份基础上加上几年、几月。
  • **ZonedDateTime:**该类代表一个时区的日期、时间。
  • **ZoneId:**该类代表一个时区
  • **DayOfWeek:**这是一个枚举类,定义了周日到周六的枚举值。
  • **Month:**这也是一个枚举类,定义了一月到十二月的枚举值。
使用 Simulink + Simscape Electrical 搭建一个三相PWM整流器模型 本文详细介绍了使用Simulink搭建三相PWM整流器模型的方法,重点讲解了SVPWM调制策略的实现过程。内容包括系统结构设计、主电路搭建、SVPWM算法实现、双闭环控制器设计以及仿真分析。通过MATLAB Function Block实现SVPWM核心算法,并给出优化建议,如死区补偿、开关频率优化等。该教程为电力电子领域工程师提供了实用的建模与仿真方法,可用于新能源并网、电机驱动等应用场景的研发与优化。 阅读详情

相关推荐

Android开发Intent详解

本文详解Android开发Intent。

qq_30725967的博客 2414

【Java 基础篇】Java Date 类详解:日期和时间操作的利器

在本篇博客中,我们详细介绍了 Java 中的java.time包,以及其中的LocalDateLocalTime和类。这些类提供了强大的日期时间处理功能,包括创建日期时间对象、格式化和解析日期时间、计算日期时间差值、调整日期时间等。使用java.time包可以更轻松地处理日期和时间,避免了早期版本中的一些问题,如可变性和精度不足。如果你是一个 Java 初学者,建议尽早开始使用java.time包来处理日期和时间,以提高你的编码效率和代码质量。

繁依Fanyi的博客 2531

(04730)半导体器件之基本放大器工作原理(一)

放大器是构成各种电子线路的基本单元电路。所谓“放大”,就是将输入的微弱信号(微弱变化的电压或电流等)去控制直流电源提供的能量,并使输出按照输入的小信号变化规律而变化的过程。所以放大器的本质是能量转换器。本节重点学习基本放大电路的工作原理和基本分析方法及主要性能指标。

黄先生的博客 3006

Java的Calendar.add(int field,int amount)

今天开始学习java的Calendar类,特别记录一下Calendar的set 和add配合使用过程(转载请注明出处哈) field -- 日历字段 amount --要添加到该字段的日期或时间的量 import java.util.*; import java.text.*; public class CalendarDemo1 { /** * @param arg

zhujason9107的博客 4084

【COMSOL】将一个面上数据导出CSV或txt格式的方法

在COMSOL中参数化扫描后,把一个面上或体里的数据按照CSV或TXT格式导出的方法。

dave496206的博客 2990

东方财富网股票API逆向分析:手把手教你破解动态参数(2024最新版)

本文详细解析了2024年东方财富网股票API的动态参数生成机制,包括回调函数、身份验证和时效控制参数的逆向工程方法。通过实战代码演示,帮助开发者破解动态参数,实现高效稳定的股票数据爬取,适用于金融数据分析和量化交易场景。

weixin_29091105的博客 1026

Java基础类库--Java日期操作类

内容学习于:edu.aliyun.com 具体内容:   从整体的java来讲一直在强调简单java类的主要设计来自于数据表的结构,那么在数据表的结构里面常用的类型:数字、字符串、日期,所以现在的程序之中只差日期了。 1. Date日期处理类   在Java里面提供有一个java.util.Date的类,这个类如果直接实例化就可以获取当前的日期时间。 代码: public class Jav...

xzzz2020的博客 531

zemax双透镜公差分析

蒙特卡罗分析: 评估公差的整体影响,模拟过程中产生一系列随机的lens,满足指定的公差,然后再按照标准评估。公差分析,就是在设计了一个理想的系统后,想看看实际生产过程中如果产生公差(误差),系统会坏到什么程度,也就是光学性能受到多大影响。反灵敏度分析:分别对每个公差在性能方面的一个给定的最小允许减少量来计算公差,也就是限制了系统性能的变化,和灵敏度分析方向相反。灵敏度分析对每个公差单独求值,分别计算每个公差操作数的最大、最小、标准值(如上图)所有设计上可能的公差都列出来了。注意要固定透镜的口径。

fendoudecheng的博客 3207

【Java基础教程】(三十七)常用类库篇 · 第七讲:日期时间处理类——三万字全面讲解 LocalDateTime和 DateTimeFormatter,Date、Calendar ~

本文介绍了Java日期时间处理类的概念,以及它们在日期和时间操作中的优势和缺点。我们讨论了Java提供的一些主要日期时间处理类,包括`Date`、`Calendar`、`SimpleDateFormat`、`LocalDateTime`和`DateTimeFormatter`等。我们分析了它们的使用方法,并提供了一些使用案例和技巧。 这些Java日期时间处理类提供了丰富的功能和灵活性,使得我们可以方便地执行日期和时间的计算、格式化、解析和比较。然而,每个类都有自己的特点和适用范围...

Technology changes the world of life 4277

uniCloud云存储进阶:七牛云扩展存储从开通、绑定域名到批量上传的完整实战

本文详细介绍了uniCloud云存储进阶实践,重点讲解如何通过七牛云扩展存储实现从开通、绑定域名到批量上传的完整流程。内容涵盖成本优势分析、域名备案方案、SSL证书配置、多文件并发上传控制等实战技巧,并提供可直接复用的代码示例,帮助开发者高效构建内容社区类应用。

weixin_26985923的博客 468

12S BMS 核心设计:基于 STM32H743+BQ34Z100 的 SOC/SOH 实现与全链路技术解析(上)

本文详细介绍了基于STM32H743和BQ34Z100的12串锂电池管理系统(BMS)设计。该系统采用主控制器+专用电量监测计架构,可实现高精度SOC(±1%)和SOH(±2%)估算,支持36V-50.4V电压范围。硬件设计包括电压/电流采样、温度测量、保护电路等模块,软件实现基于HAL库开发,采用DMA方式提高I2C通信效率。系统通过TI专利的ImpedanceTrack™算法实现三维融合估算,并具备完善的保护功能。该设计适用于电动工具、轻型电动车等中功率设备,具有精度高、响应快。

bother3000的博客 1393

Java中的Date日期类

Date类 导包:java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。 第一个构造函数使用当前日期和时间来初始化对象。 Date( ) 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。 Date(long millisec) public class DateDemo01 { publ...

syf_519的博客 300

构建栅格地图matlab代码

1 使用MATLAB实现地图栅格化 效果图如下所示 图1 ...

qq_59747472的博客 4518

Java基础(十七):日期时间API

一个Calendar的实例是系统时间的抽象表示,可以修改或获取 YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND等。第三次引入的API是成功的,并且Java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。Java 8 以一个新的开始为 Java 创建优秀的 API。获取月份时:一月是0,二月是1,以此类推,12月是11。获取星期时:周日是1,周一是2 ,。获取Calendar实例的方法。

从基础到源码解析的学习记录 1451

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JAVA日期转换中文格式

JAVA日期转换中文格式

MarkLuoBo的博客 3013

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java Review (零、初识)

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

2401_83330193的博客 607

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java 生成中文日期

java 生成中文日期

u013171471的博客 764

Java笔记(二十五)……其他常用API

System类 工具类全部都是静态方法 常用方法 获取系统属性信息 static PropertiesgetProperties()static StringgetProperty(String key) 设置自定义属性信息static StringsetProperty(String key, String value) 命令行设置自定义属性信息 1: import java...

aev57372的博客 128

咱们一起学 Java(第二十五篇)

大家好,在之前的学习中,我们已经了解了如何创建用户自定义类,包括类的基本结构、实例域、构造器和实例方法的相关知识,并且通过`Employee`类的示例有了初步的实践。今天,我们将深入剖析`Employee`类,进一步探讨构造器的细节、方法中的隐式参数与显式参数等重要概念,这将帮助我们更加深入地理解Java面向对象编程中类的内部机制,提升我们编写高质量类的能力。

wj_rdk的博客 2201

日期格式转化,把20110125转化为二零一一年一月二十五日

<br />随便写了个,凑和能用,做个记录<br />上代码<br /> public static String trans(final String s) throws Exception { final StringBuffer result = new StringBuffer(); final HashMap<String ,String > m = new HashMap<String,String>(); m.put("0", "零"); m.put("1", "一")

yaoweijq的专栏 1271

Java基础(二十五):Lambda表达式、方法引用、构造器引用

只要看起来没有歧义,只能仅有调用某个方法,传入某些参数,就可以简化为Lambda表达式或方法构造器引用。

从基础到源码解析的学习记录 1810

【SQL开发实战技巧】系列(十二):三问(如何对字符串字母去重后按字母顺序排列字符串?如何识别哪些字符串中包含数字?如何将分隔数据转换为多值IN列表?)

如何将分隔数据转换为多值IN列表、如何按字母顺序排列字符串、如何对字符串字母去重后按字母顺序排列字符串、如何删除字符串中的字符保留数字。【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。这篇文章还是介绍的字符串处理案例,还是那句话,这些操作太太太常见了。后面还会写,而且是更麻烦更难的需求。

赵延东的一亩三分地 9万+

计算两个日期之间相差多少天,计算当前日期是星期几

完美世界编程题,计算两个日期之间经过了多少个零点和多少个星期四。 package wanmeishijie170926; /* *输入 2017/9/7 0:0:0 2017/9/21 0:0:0 输出 13,1 * */ import java.util.Scanner; public class Test1 { public static void main(Strin

say_haha的博客 2452

蓝桥杯31天冲刺之二十五 [java]

今天去申请了个东西,用了多半天,回来还补作业,还要看编译,连着两天上扛不住了,今天先写俩了,板块一兄弟们根据情况自己写吧,不会了回去翻一下我原来写的 文章目录板块一:之前做过的历届真题的复习板块二:今日练习成绩统计(20年省赛)既约分数(20年省赛)最优包含(19年国赛) 板块一:之前做过的历届真题的复习 更题解可以用一两句话带过,主要记录再刷之后的心得,比如用到的知识点或者自己大意的地方 1、空间(21年省赛——3月14日) https://www.lanqiao.cn/problems/1445/l.

Qlz的博客 995

Mkyong 中文博客翻译(二十五)

原文:Mkyong 协议:CC BY-NC-SA 4.0 Java 8 forEach 示例 原文:http://web.archive.org/web/20230101150211/https://mkyong.com/java8/java-8-foreach-examples/ 在 Java 8 中,我们可以使用新的forEach来循环或迭代一个Map、List、Set或Stream。 主题 循环地图 循环列表 forEach 和 Consumer forEach 和异常处理 forEach

龙哥盟 469
上一篇: Java(二十四)——Java抽象类与接口
下一篇: HTML5(一)——HTML5简介
Undergoer_TW
博客等级 码龄11年 185粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值