Java SE核心API(3) —— 日期、时间操作

Java 编码系列:日期和时间、文件操作 本文深入探讨了 Java 中的日期和时间处理、文件操作的底层原理,并结合大厂的最佳实践,帮助读者掌握这些核心概念。正确理解和使用这些技术不仅可以提高代码的可读性和性能,还能避免一些常见的错误。希望本文对你有所帮助,如果你有任何问题或建议,欢迎留言交流。希望这篇文章能够满足你的需求,如果有任何进一步的问题或需要更多内容,请随时告诉我! 阅读详情

一、Date类及其常用API

  Java中的时间使用标准类库的Date类表示,是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点。固定的时间点叫纪元,是UTC时间的1970年1月1日00:00:00。UTC(Universal Time Coordinated世界调整时间)与GMT(Greenwich Mean Time格林威治时间)一样,是一种具有实际目的的科学标准时间。
  java.util.Date类封装日期及时间信息。
  

1.1、getTime()、setTime()
package day03;

import java.util.Date;

/**
 * java.util.Date其内部维护一个long值保存从1970年元旦到这一刻的毫秒值  
 * @author Administrator
 */
public class DateDemo {
    public static void main(String[] args){
        //创建出来的实例表示当前系统时间
        Date date = new Date();
        /*Date重写了toString()方法,用一个字符串来描述当前Date对象
        *所表示的时间。
        *Mon Feb 18 18:06:00 CST 2017
        */
        System.out.println(date);
        //获取1970年1月1日零时距此刻的毫秒数
        long time = date.getTime();
        time += 1000*60*60*24;
        System.out.println(time);
        //设置为距离此刻一天后的日期和时间
        date.setTime(time);
        System.out.println(date);

    }
}

二、SimpleDateFormat类

  java.text.SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。它可以进行与日期相关的格式化(日期->文本)、解析(文本->日期)和规范化。

2.1、SimpleDateFormat()、format()

  构造方法SimpleDateFormat(String pattern)可以按照给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
  日期模式匹配字符:
  y —— 年
  M —— 月
  d —— 日
  E —— 星期
  a —— AM或PM标识
  H —— 小时(24小时制)
  h —— 小时(12小时制)
  m —— 分钟
  s —— 秒

  final String format(Date date),该方法可以将Date格式化为String。

package day03;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * SimpleDateFormat可以根据一个特定的日期格式字符串将字符串与Date之间相互转换
 * @author Administrator
 *
 */
public class SimpleDateFormatDemo {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println(now);        
        //2014-08-21 11:07:22
        String format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);        
        String str = sdf.format(now);
        System.out.println(str);    
    }
}
2.2、parse()

  和format方法相反,parse方法可按照特定格式将表示时间的字符串转换为Date对象。

package day03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 将字符串转换为Date
 * @author Administrator
 *
 */
public class SimpleDateFormatDemo2 {
    public static void main(String[] args) throws ParseException{
        String str = "2008年8月21日 23:44:21";
        String format = "yyyy年MM月dd日 HH:mm:ss";

        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = sdf.parse(str);
        System.out.println(date);

    }
}

三、Calendar类

  java.util.Calendar类用于封装日历信息,其主要作用在于其方法可以对时间分量进行运算。
  Calendar是抽象类,其具体子类针对不同国家的日历系统,其中应用最广泛的是GregorianCalendar(格里高里历,即通用的阳历),对应世界上绝大多数国家/地区使用的标准日历系统。

3.1、getInstance()、getTime()、setTime()

  Calendar提供了一个类方法getInstance,返回一个Calendar对象,其日历字段已由当前日期和时间初始化。
  Date getTime(),使用Date描述Calendar表示的日期并返回。
  void setTime(Date d),使Calendar表示Date所描述的日期。

package day03;

import java.util.Calendar;
import java.util.Date;

/**
 * java.util.Calendar
 * 日历类
 * 该类是一个抽象类,封装了对时间的相关操作。
 * 常用的实现类格里高里历(阳历)
 * 使用日历类是为了对时间进行相关的操作。比如计算时间。
 * @author xxx
 *
 */
public class CalendarDemo1 {
    public static void main(String[] args) {
        /*
         * 使用Calendar的静态方法创建实例,该方法会根据当前系统所在地区创建一个相应的实现,
         * 通常是GregorianCalendar。
         * 默认创建的日历实例表示当前系统时间。
         */
        Calendar calendar = Calendar.getInstance();

        /*
         *toString不能直观反映表示的日期 
         */
        System.out.println(calendar);

        /*
         *Calendar与Date之间的转换
         *Calendar -> Date
         *Date getTime()
         *Calendar提供了方法getTime(),该方法返回一个Date对象,
         *该对象表示的时间就是当前Calendar表示的时间。
         */
        Date date = calendar.getTime();
        System.out.println(date);

        //表示明天这一时刻
        date.setTime(date.getTime() + 1000 * 60 * 60 * 24);
        System.out.println(date);

        /*
         *Date -> Calendar
         *void setTime(Date date)
         *Calendar的setTime方法可以使用当前Calendar表示给定的Date所表示的时间。
         */
        //Calendar也表示明天这一刻了
        calendar.setTime(date);
    }
}
3.2、set()、get()
package day03;

import java.util.Calendar;

/**
 * Calendar提供了针对不同时间分量单独设置值的方法。
 * void set(int field,int value)
 * 其中第一个参数为:时间分量,例如:年,月,日等等。第二个参数为对应的值。
 * 时间分量是一个int值,使用Calendar提供的常量。
 */
public class CalendarDemo2 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getTime());

        /*
         *设置Calendar,使其表示
         *2008-08-08 20:08:08
         */
        //设定年
        calendar.set(Calendar.YEAR,2008);
        System.out.println(calendar.getTime());

        /*
         * 设置月
         * 月从0开始,0表示1月。
         * 或者可以使用具体月的常量。
         */
        calendar.set(Calendar.MONTH, Calendar.AUGUST);
        //calendar.set(Calendar.MONTH, 7);

        /*
         * 设置日
         * 对应的时间分量常用的:
         * DATE:月中天
         * DAY_OF_MONTH:月中的天,与DATE一致
         * DAY_OF_WEEK:周中的天,星期几
         * DAY_OF_YEAR:年中的天
         */
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        System.out.println(calendar.getTime());
        //时
        calendar.set(Calendar.HOUR_OF_DAY, 20);
        //分
        calendar.set(Calendar.MINUTE, 8);
        //秒
        calendar.set(Calendar.SECOND, 8);

        System.out.println(calendar.getTime());
    }
}
package day03;

import java.util.Calendar;

/**
 * 获取一个Calendar表示的日期中各个时间分量对应的值。
 * @author xxx
 *
 */
public class CalendarDemo3 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        /*
         * int get(int field)
         * 获取对应时间分量的值
         */
        //获取年
        int year = calendar.get(Calendar.YEAR);
        //获取月
        int month = calendar.get(Calendar.MONTH) + 1;
        //获取日
        int day = calendar.get(Calendar.DATE);
        System.out.println(year+"-"+month+"-"+day);

        int hour = calendar.get(Calendar.HOUR_OF_DAY);

        int min = calendar.get(Calendar.MINUTE);

        int sec = calendar.get(Calendar.SECOND);
        System.out.println(hour+":"+min+":"+sec);

        //查看星期几?
        int dow = calendar.get(Calendar.DAY_OF_WEEK);
        System.out.println("周"+(dow==1?7:dow-1));
        String[] data = {"日","一","二","三","四","五","六"};
        System.out.println("周"+data[dow-1]);

        //到今天为止,今年已经多了多少天?
        int doy = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(year+"已经过了"+doy+"天");
    }
}
3.3、getActualMaximum()

  int getActualMaximum(int field)给定此Calendar的时间值,返回指定日历字段可能拥有的最大值。

package day03;

import java.util.Calendar;

/**
 * 获取某一个时间分量所允许的最大值
 * @author xxx
 *
 */
public class CalendarDemo4 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();

        //当月总共多少天?
        int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //查看2016年2月多少天?
        calendar.set(Calendar.MONTH, 1);
        days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println(days);

        //今年总共多少天?
        days = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
        System.out.println("今年共:"+days+"天");
    }
}
3.4、add()

  void add(int field,int mount)为给定的时间分量的值加上给定的值,若给定的值为负数则是减去给定的值。

package day03;

import java.util.Calendar;

/**
 * Calendar中计算时间的方法
 * void add(int field,int value)
 * 对指定的时间分量加上给定的值,若给定的值是负数,则是减去给定的值。
 * @author xxx
 *
 */
public class CalendarDemo5 {
    public static void main(String[] args) {
        /*
         * 查看3年2个月零8天以后的日期?
         */
        Calendar calendar = Calendar.getInstance();

        //查看3年后
        calendar.add(Calendar.YEAR, 3);
        System.out.println(calendar.getTime());

        //再查看2个月后
        calendar.add(Calendar.MONTH, 2);
        System.out.println(calendar.getTime());

        //再查看8天以后
        calendar.add(Calendar.DAY_OF_YEAR, 8);
        System.out.println(calendar.getTime());

        //再查看5小时以前
        calendar.add(Calendar.HOUR_OF_DAY, -5);
        System.out.println(calendar.getTime());
    }
}

四、关于时间的综合操作

  一般开发需求为要求用户输入一个日期,然后对该日期进行一系列的运算,再将计算后的日期显示给用户。则其解决流程如下:
1. 获取用户输入的日期字符串。
2. 使用SimpleDateFormat将其转换为Date。
3. 创建一个Calendar,使其表示Date表示的日期。
4. 使用Calendar根据需求计算时间。
5. 将Calendar转换为一个Date。
6. 使用SimpleDateFormat将Date转换为字符串后显示给用户。

Java 核心 API :所有类的基类,提供了 、、、 等方法。:字符串操作,如 、、、 等。 / :可变字符串操作。:数学运算,如 、、、 等。:系统操作,如 、、 等。集合框架::有序集合,如 、。:无序集合,如 、。:键值对集合,如 、。工具类:(集合操作)、(数组操作)。日期和时间:、(旧版)。、、(Java 8 引入的新日期 API)。其他工具类::对象操作,如 、。:避免空指针异常。文件操作::文件或目录操作。 / :文件读写。 / :缓冲读写。序列化::对象序列化接口。高效 IO 操作::字节缓冲区。:通道操作。:文 阅读详情

相关推荐

Dify 深度进阶:从入门到精通AI应用构建

《Dify进阶指南:从基础到高阶的AI应用开发技巧》 本文深入探讨Dify平台的高级功能与应用开发技巧。首先强调核心概念的深化,包括提示词工程进阶、知识库高效管理和模型参数优化。重点介绍智能体应用的开发方法,如何让AI具备自主规划与执行能力。同时讲解工作流编排、前端集成等实用技术,并分享应用运营优化、成本控制等实践经验。文章还展望了Dify生态的发展趋势,为开发者提供从基础到进阶的完整学习路径,助力打造更智能高效的AI应用。

同名公众号:dify实验室 1950

【ES实战】初探ES date类型的时区机制

ES date时区问题

有问题的请私信或关注v【技术印记】留言 3084

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上 参考了好多大神博客,自己写的过程中发现,还有些小细节。 一、打开Notepad写需要的字 另存为 UTF-16LE 也就是Unicode。 二、打开FontCvtST转 删掉所有字 读入test.txt里的字 选择刚才的test.txt 另存为.c文件 改个英文名 复制到RTOS的例程文件夹下 三、打开GUIBuilder 画一个这样的 保存之前要注意路径配置要在当前位置,否则存不上 生成的D

weixin_41376117的博客 1935

java es date 时间处理

最近在存储数据到es中,总会有各种各样的问题,找遍了全网,也没有发现一个总结的比较好的,特此个人总结一下。 1.在使用log(elk,logstash)存储数据到elk时,因为用的是带时区的方法,也就是: yyyy-MM-dd'T'HH:mm:ss:SSS'Z' 这种格式,默认是UTC时间,东八区需要+8小时,所以在打日志的时候存储其他时间时: 时间不要以这种格式: yyyy-MM-...

夏微凉秋微暖的博客 8649

Xilinx System Generator多速率系统(Multi-Rate Systems)的使用

在本实验练习中,您将学习在System Generator中如何使用多个时钟域有效地实现具有多个数据速率的设计。

白码王子小张的博客 1093

用KalmanNet搞定非线性状态估计:当卡尔曼滤波遇上神经网络

本文深入探讨了KalmanNet如何将神经网络与卡尔曼滤波结合,以解决非线性状态估计中的模型失配和噪声不确定性问题。通过保留经典滤波框架并用RNN学习卡尔曼增益,该方法在无人机导航、机器人定位等场景中实现了模型驱动与数据驱动的优势互补,提升了估计的鲁棒性和灵活性。

mango的博客 310

【JavaSe】常用API篇(六) 日期时间类

JavaSe·常用API篇(六) 日期时间类 1. Date类 1.1 概述 java.util.Date 类 表示特定的瞬间,精确到毫秒。 1.2 构造方法 查阅构造方法,发现Date拥有多个构造函数,只是部分已经过时,但是其中有未过时的构造函数可以把毫秒值转成日期对象。 public Date() :分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。 public Dat...

不想当架构师的程序员不是好程序员 719

华为OD机试 - 矩形绘制 - 数组、坐标偏移(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除。 当新绘制的矩形与已有图形重叠时,对图形取并集; 当新擦除的矩形与已有图形重叠时,对图形取差集。 给定一系列绘制和擦除操作,计算最终图形的面积。第一行为操作数N,接下来的N行格式为:d x1

学Java,找哪吒 836

Java-日期时间API(详解)

本博主将用优快云记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,欢迎关注!System类提供的用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。//称为时间戳 System . out . println(time);表示特定的瞬间,精确到毫秒类为。...

weixin_52533007的博客 3455

CS 188 Project3(RL) Q10:Approximate Q-Learning

实现一个近似的Q-learning学习代理,它学习状态特征的权重,其中许多状态可能共享相同的特征。在qlearningAgents.py中的ApproximateQAgent类中编写实现,它是PacmanQAgent的子类。 注:近似Q-learning学习假设在状态和动作对上存在一个特征函数f(s,a),它产生一个向量f1(s,a) .. fi(s,a) .. fn(s,a)特征值。我们在fe...

大模型与Agent智能体 2655

华为OD机试新系统真题【仓库盘点】

华为OD机试真题 新系统【仓库盘点】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【仓库盘点】

qq_45776114的博客 573

ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南

文章目录ES中的日期类型案例原理揭秘路为何这么不平又一个坑总结ES 的时间类型为什么这么难用,有没有什么办法可以解决? ES中的日期类型 时间和日期类型是我们作为开发每天都会遇到的一种常见数据类型。和Java中有所不同,Elasticsearch 在索引创建之前并不是必须要创建索引的mapping。关系型数据库的思维就是在中写入数据之前,并不强制创建表结构。我们不用事先声明字段名称,字段类型以及长度等属性就可以直接像一个不存在的表中直接写入数据。 Elasticsearch把这种特性称之为dynamic m

Elastic开源社区 3万+

基于Simulink的电机功率因数校正仿真

PF=SP​=视在功率有功功率​=cosϕ⋅Irms​I1​​(非正弦时)位移因数(cosϕ):基波电压电流相位差畸变因数(I1​/Irms​):谐波导致电流有效值增大本文带你完成了电机系统功率因数校正的Simulink仿真,实现了:✅ 理解了低功率因数的成因与危害✅ 搭建了无PFC、无源PFC、有源PFC三种对比模型✅ 掌握了Vienna整流器建模与dq解耦控制方法✅ 实现了PF与THD的自动计算与评估✅ 验证了有源PFC在PF、THD、稳定性上的全面优势。

amy_mhd的博客 154

Java日期时间操作

Java日期时间

weixin_42329561的博客 3238

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

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

Java SE入门及基础(57)& Java常用API & 日期时间

当然可以,首先我们需要将日期按照我们熟悉的日期格式转换为一个字符串日期,然后再打印。//时间单位一般是毫秒,当然更精确的是纳秒。打印的日期不好看懂,能否按照我们熟悉的方式来打印?带参构造,表示根据给定的时间数字来构建一个日期对象,精确到毫秒。判断当前对象表示的日期是否在给定日期之前。判断当前对象表示的日期是否在给定日期之后。根据给定的日期格式构建一个日期格式化对象。获取日期对象中的时间数字,精确到毫秒。将给定的字符串格式日期解析为日期对象。设置日历表示的日期对象。获取日历表示日期对象。

m0_63181360的博客 1355

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java核心技术:日期和时间新旧API对比

本文作者:小虚竹,优快云博客专家&优快云原力计划作者,Java领域优质创作者,掘金年度人气作者,华为云专家,阿里云专家博主,51CTO专家博主。是一个乐于分享“IT圈”技术的博主。开篇介绍学习Java的经典名著非常多,这本书是你一定不能错过的:由凯.霍斯特曼写的《Core Java》,中文版名为《Java核心技术》。这本书几乎出现在每个“学Java要看什么书”...

华章IT官方博客 599

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java中的日期时间API详解:从Date、Calendar到现代时间体系

摘要 Java日期时间API经历了三个阶段的演进: 第一代:java.util.Date(JDK 1.0)存在设计缺陷,仅封装毫秒数,时区处理混乱 第二代:Calendar(JDK 1.1)引入时区和历法支持,但API复杂且非线程安全 第三代:java.time(JDK 8/JSR 310)基于Joda-Time设计,提供LocalDate、ZonedDateTime等不可变类,解决了线程安全和易用性问题 核心概念包括: Unix时间原点(1970-01-01 UTC) 面向人类和机器的两种时间表示模型 时

百锦再的博客 1905

温故 Java 8 日期 API

前言 为什么我们需要一个新的日期和时间库? Java开发中一个长期存在的窘境是对普通开发者的date和time用例支持不足。 例如,现存的类(例如java.util.Date和SimpleDateFormatter)不是线程安全的,导致潜在的并发问题——不是普通开发者所期望的编写日期处理时的代码。 一些日期和时间类也表现出相当差的API设计。例如,java.util.Date中的年份开始于190...

MyBlog 801

时间/日期API——基于Java SE8

Java 8新特性

ice's blog 576

Java8 新日期时间 API:从设计理念到实战应用

Java8 新日期时间 API 通过不可变设计清晰职责划分丰富的功能特性,彻底解决了旧 API 的线程安全、设计混乱、时区处理复杂等问题。无论是简单的日期格式化,还是复杂的跨时区计算,新 API 都能以简洁、安全的方式实现。掌握新 API 不仅能提升代码质量(减少线程安全问题),还能降低维护成本(清晰的职责划分让代码更易读)。建议在新项目中完全采用新 API,并逐步将旧项目中的旧 API 替换为新 API,充分发挥其优势。若需进一步深入学习,可参考官方文档(

QiuMing 771

算法竞赛中的常用JAVA API :Calendar日期类

文章目录摘要Calendar类常用的日历字段Claendar类的实例化设置特定日期 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法。Date类大部分方法已经废弃了,所以本文将详细介绍Calendar类。 Calendar类 Calendar 类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOU...

GD_ONE的博客 9116

(十七)Java日期时间API全面解析:从传统Date到现代时间处理

类提供了多种预定义格式:java可以使用模式字符串创建自定义格式化器:java常用模式字母:y - 年M - 月d - 日H - 小时(0-23)m - 分s - 秒S - 毫秒z - 时区名称Z - 时区偏移量Java 8日期时间API支持扩展:java// 使用泰国佛教历// 输出如:ThaiBuddhist BE 2567-05-15Java 8日期时间API代表了Java平台日期时间处理的现代化方向。

MeyrlNotFound的博客 1112

Java工具类Calendar详解:日期时间操作的瑞士军刀

本文全面解析了Java的Calendar类,它是处理日期时间的核心工具,弥补了早期Date类的不足。主要内容包括:Calendar类概述(抽象类、字段操作、时区支持等)、多种获取实例的方法、基本日期操作(获取/设置日期、日期计算比较)、与Date的转换、时区处理技巧以及高级应用(日期差值计算、获取月末日期等)。Calendar类提供了强大的日期处理能力和时区支持,是Java日期操作的重要工具。

weixin_51786043的博客 1280

《Java核心技术》读后感(JAVA 小虚竹)

读后感

小虚竹的专栏 2万+

Java8 日期时间类

Java8 日期时间类

qq_31236849的博客 2794
上一篇: Java SE核心API(2) —— 正则表达式、Object、包装类
下一篇: Java SE核心API(4) —— 集合、泛型
Robot__Man
博客等级 码龄12年 251粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值