Java的时间处理与Mysql的时间查询

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 本文总结了Java中时间与日历的常用操作,包括时间的转换、格式化、日期加减及比较,并介绍了MySQL中按天、周、月、季度和年进行时间范围查询的方法,适用于日常开发中的时间处理需求。

     身为一名程序员,少不了要对时间、日期做一些比较、转换等等的处理,和根据一定的时间条件对数据库进行查询操作,每次遇到这样的问题的时候大部分都会去百度然后找一些符合需求的文章进来张贴复制使用,当然有一些用的多了也就自己记着了,但是觉得还是有必要总结一下。

      0 0可能是太基础了吧,BOSS知道我最近在写技术文章,问了问内容,他让我以后写一些提高点的,别老写基础,不管先把这个总结了。

一、Java时间的转换、比较与日历的应用

Date的基本使用

体验AI代码助手

代码解读

复制代码

//获取Date
Date date = new Date();
//也可以从Calendar中获取Date
Calendar calendar = Calendar.getIntance();
Date date = calendar.getTime();

//获取时间戳(当前时间) 1534143874090
//方式一
System.out.println(date.getTime());
//方式二 现在系统一般都推荐用这种方式
System.out.println(System.currentTimeMillis());


//格式化时间
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//Date类自带的格式化
DateFormat dateTime = DateFormat.getDateTimeInstance();
DateFormat date = DateFormat.getDateInstance();

//将时间转为格式化字符串
//2018-08-13 11:44:25
System.out.println(timeFormat.format(new Date()));
System.out.println(dateTime.format(new Date()));
//2018-08-13
System.out.println(date.format(new Date()));
System.out.println(dateFormat.format(new Date()));、

//将格式化字符串转为时间
//Mon Aug 13 11:44:25 CST 2018 必须用完整的时间格式
System.out.println(timeFormat.parse("2018-08-13 11:44:25"))

Calender的基本使用

     上面是时间格式的一些转换,比较简单,但真正烦人的是往往并不是用现在的这个时间,需要去时间进行调整计算,就得用到日历了,设置成指定时间,日期加减、比较等等。

体验AI代码助手

代码解读

复制代码

//可以获取当前的日历
Calendar calendar = Calendar.getInstance();
//也可以通过DateFormat获取日历
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = dateFormat.getCalendar();
//直接给日历设置指定时间
calendar.setTime(new Date());

//1年后
calendar.add(Calendar.YEAR, 1);
//1年前
calendar.add(Calendar.YEAR,  -1);
//同样的可以替换成Calendar.MONTH,Calendar.DAY_OF_YEAR,Calendar.HOUR等等单位进行替换从而加减

Date与Calender的应用

1 最经常的就是计算两个日期中间差了多少天,不多说,来看代码。

体验AI代码助手

代码解读

复制代码

public static int getDayDiffer(int beginDay, int endDay) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    Date beginDate = sdf.parse(String.valueOf(beginDay));
    Date endDate = sdf.parse(String.valueOf(endDay));
    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(beginDate);
            
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(endDate);
    int day1 = cal1.get(Calendar.DAY_OF_YEAR);
    int day2 = cal2.get(Calendar.DAY_OF_YEAR);
            
    int year1 = cal1.get(Calendar.YEAR);
    int year2 = cal2.get(Calendar.YEAR);
    if (year1 != year2)   //不一年
    {
        int timeDistance = 0;
        for (int i = year1; i < year2; i++) {
            if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)    //闰年
            {
                timeDistance += 366;
            } else    //不是闰年
            {
                timeDistance += 365;
            }
        }
                
        return timeDistance + (day2 - day1);
    } else {  //同年
    
        return day2 - day1;
    }
            
}

2 这是我当时通过传一个指定日子,需要拿他后面一年的所有日期的格式化时间。

体验AI代码助手

代码解读

复制代码

public static JSONArray getFormatTimeAllYear(String yyyyMMdd) {
    List<String> result = new ArrayList();
    result.add(yyyyMMdd);
    //+10000等于年的个位数+1
    int endYear = Integer.parseInt(yyyyMMdd)+10000;
    //如果是当前年就将最后一天设置成当天
    if(String.valueOf(yyyyMMdd).startsWith(String.valueOf(calendar.get(Calendar.YEAR)))) {
    //getCurrentyyyMMdd()获取天前格式化日期
    endYear = getCurrentyyyyMMdd();
    }
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    Date beginDate = new Date();
    Date endDate = new Date();
    try {
        beginDate = sdf.parse(String.valueOf(yyyyMMdd));
        endDate = sdf.parse(String.valueOf(endYear));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    Calendar begin = Calendar.getInstance();
    begin.setTime(beginDate);
        
    //用after方法来判断是否在某日期之后,同有before来判断之前
    while (endDate.after(begin.getTime()))  {
        // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
        begin.add(Calendar.DAY_OF_MONTH, 1);
        result.add(Integer.valueOf(sdf.format(begin.getTime())));
    }
    result.remove(result.get(result.size()-1));
    return result;
}
       
       
       
public static int getCurrentyyyyMMdd() {
    Calendar calenda = Calendar.getInstance();
    String year = String.valueOf(calenda.get(Calendar.YEAR));
    String mounth = String.valueOf(calenda.get(Calendar.MONTH) + 1);
    String day = String.valueOf(calenda.get(Calendar.DAY_OF_MONTH));
    if (mounth.length() == 1) {
        mounth = "0" + mounth;
    }
    if (day.length() == 1) {
        day = "0" + day;
    }
    return Integer.valueOf(year + mounth + day);
}

3 还有就是经常需要计算某天是周几一类的操作。

体验AI代码助手

代码解读

复制代码

   //计算某一天是周几
   public static int getDayOfWeek(String yyyyMMdd) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date beginDate = new Date();
        try {
            beginDate = sdf.parse(yyyyMMdd);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(beginDate);
        //国外的第一天是从周一开始算的
        int day = cal.get(Calendar.DAY_OF_WEEK)-1;
        if(day == 0) {
            day = 7;
        }
        return day;
    }
    
    
    
    //计算某一周是一年中的第几周
    public static String getWeekOfYear(String yyyyMMdd) {
        try {
                
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
            Calendar cal = Calendar.getInstance();
            //这一句必须要设置,否则美国认为第一天是周日,而我国认为是周一,对计算当期日期是第几周会有错误
            cal.setFirstDayOfWeek(Calendar.MONDAY);
            cal.setTime(df.parse(yyyyMMdd));
            return String.valueOf(cal.get(Calendar.WEEK_OF_YEAR));
                
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
        

二、Mysql的时间查询

在使用数据库操作时,也会经常用到按照一定的时间要求来去查询或者进行操作。

1 查询当天的记录

体验AI代码助手

代码解读

复制代码

select * from `student` where to_days(create_time) = to_days(now());

2 查询当周的记录

体验AI代码助手

代码解读

复制代码

//其中的 -insterval 1 day 是因为国外一周从周日开始,这里-1从周一开始计算
select * from `student`  where yearweek(date_format(`create_time`, '%y-%m-%d') - interval 1 day) = yearweek(now() - interval 1 day);

3 查询上周的记录

体验AI代码助手

代码解读

复制代码

select * from `student`  where yearweek(date_format(`create_time`, '%y-%m-%d') - interval 1 day) =  yearweek(now() - interval 1 day) -1;

4 查询7天记录

体验AI代码助手

代码解读

复制代码

//根据 interval X day 来调整日期
select * from `student` where date_sub(curdate(), interval 7 day) <= date(`create_time`);

5 查询月份记录

体验AI代码助手

代码解读

复制代码

// = 0是当月 如果是1则是上个月
select * from `student`  where period_diff( date_format( now( ) , '%y%m' ) , date_format(`create_time`,  '%y%m' ) ) = 0

6 查询季度记录

体验AI代码助手

代码解读

复制代码

select * from `student` where QUARTER(`create_time`)= QUARTER(now());

7 查询上季度记录

体验AI代码助手

代码解读

复制代码

// 根据 interval X QUARTER 来调整季度
select * from `student` where QUARTER(`create_time`)= QUARTER(now(),interval 1 QUARTER));

8 查询当年记录

体验AI代码助手

代码解读

复制代码

select * from `eco_yunyan_status_history` where YEAR(`create_time`)= YEAR(now());

9 查询去年记录

体验AI代码助手

代码解读

复制代码

select * from `eco_yunyan_status_history` where YEAR(`create_time`)= YEAR(now()) -1;

     以上就是总结一些常用的在Java里的时间、日历的使用,以及一些简单的Mysql的时间范围查询


转载来源:https://juejin.cn/post/6844903656144240648

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
263 14
|
5月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
145 15
|
5月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
217 13
|
5月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
5月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
5月前
|
SQL 监控 关系型数据库
MySQL高级查询技巧:子查询、联接与集合操作
本文深入解析了MySQL高级查询的核心技术,包括子查询、联接和集合操作,通过实际业务场景展示了其语法、性能差异和适用场景,并提供大量可复用的代码示例,助你从SQL新手进阶为数据操作高手。
|
5月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
5月前
|
SQL 关系型数据库 MySQL
MySQL入门指南:从安装到第一个查询
本文为MySQL数据库入门指南,内容涵盖从安装配置到基础操作与SQL语法的详细教程。文章首先介绍在Windows、macOS和Linux系统中安装MySQL的步骤,并指导进行初始配置和安全设置。随后讲解数据库和表的创建与管理,包括表结构设计、字段定义和约束设置。接着系统介绍SQL语句的基本操作,如插入、查询、更新和删除数据。此外,文章还涉及高级查询技巧,包括多表连接、聚合函数和子查询的应用。通过实战案例,帮助读者掌握复杂查询与数据修改。最后附有常见问题解答和实用技巧,如数据导入导出和常用函数使用。适合初学者快速入门MySQL数据库,助力数据库技能提升。
|
6月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
579 9
|
7月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
382 0

推荐镜像

更多