首页 > 其他分享 >不推荐使用Date日期和Calendar日期

不推荐使用Date日期和Calendar日期

时间:2023-05-29 16:13:26浏览次数:32  
标签:format int 获取 日期 LocalDateTime Date Calendar now

很神奇,为什么java中不推荐使用Date与Calendar日期了,很多时候初学者在刚学习java时,大部分使用的日期都是Date与Calendar,只有及少数个别使用的LocalDateTime日期

  Date 与 Calendar存在的共性问题

  • 毫秒值与日期直接转换麻烦和繁琐,然后通过毫秒值来计算时间的差额步骤较多,并且还可能存在误差

  • 再有一个就是线程问题,我们都知道在创建一个Date日期变量时,它的格式不是我们能看懂的日期格式,这时候就需要使用SimpleDateFormat了,然后

    这就引发了一个问题,这个类的线程是不安全的(在做生产总览的时候,需要大量使用日期类,当时每个类我都创建了一个SimpleDateFormat,想着有点

    浪费内存空间了,然后在service层最上面定义了一个静态的日期格式类,接着就引发了一个问题,页面报错,然后查询资料才知道,多个线程

    对同一个类操作造成了格式化错误,甚至有可能引发内存泄漏,可能导致内存泄漏问题,占用过多的内存资源)

使用日期推荐LocalDate、LocalTime、LocalDateTime这三个日期类

1. LocalDate类是一个不可变的日期时间对象,表示日期,通常被视为年月日

 // 获取当前年、月、日
LocalDate today = LocalDate.now();
// 获取年
int year = today.getYear();
// 获取月
int month = today.getMonthValue();
// 获取天
int day = today.getDayOfMonth();
// 获取毫秒值
LocalDateTime startOfDay = localDate.atStartOfDay();
long millisecondsFromDate = startOfDay.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

2. LocalTime类是一个不可变的日期时间对象,代表一个时间,通常被看作小时-秒,时间表示为纳秒精度

 // 获取当前年、月、日
LocalTime time = LocalTime.now();
int hour = time.getHour(); // 获取小时
int minute = time.getMinute(); // 获取分钟
int second = time.getSecond(); // 获取秒
int nano = time.getNano(); // 获取纳秒

3. LocalDateTime是一个不可变的日期时间对象,代表日期时间,通常被视为年-月-日- 时-分-秒

LocalDateTime dateTime = LocalDateTime.now();
int year = dateTime.getYear(); // 获取年份
int month = dateTime.getMonthValue(); // 获取月份 (1-12)
int dayOfMonth = dateTime.getDayOfMonth(); // 获取月份中的天数
int hour = dateTime.getHour(); // 获取小时
int minute = dateTime.getMinute(); // 获取分钟
int second = dateTime.getSecond(); // 获取秒
int nano = dateTime.getNano(); // 获取纳秒

// 获取毫秒值
// 需要将LocalDateTime变量转换为ZoneDateTime对象
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
Instant instant = zonedDateTime.toInstant();
long milliseconds = instant.toEpochMilli();

// 日期格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dayTime = dateTimeFormatter.format(dateTime);
方法名 说明
public LocalDateTime plusYears(long years) 添加或者减去年
public LocalDateTime plusMonths(long months) 添加或者减去月
public LocalDateTime plusDays(long months) 添加或者减去日
public LocalDateTime plusHours(long hours) 添加或者减去时
public LocalDateTime plusMinutes(long minutes) 添加或者减去分
public LocalDateTime plusSeconds(long seconds) 添加或者减去秒
public LocalDateTime plusWeeks(long weeks) 添加或者减去周

这里要注意!!根据业务需求使用不同的日期,如果前端传值为年-月-日,而后端使用了LocalDateTime日期会报无法转换的问题,这是因为LocalDateTime底层是被final修饰了无法更改,它的格式只能是年-月-日 时:分:秒,所以要使用对应的日期格式

使用示例:(获取一天中的24小时,然后使用String的format方法截取)

// 创建 DateTimeFormatter 对象,指定时间格式为 "yyyy-MM-dd HH:mm:ss"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDate date = LocalDate.parse(dayTime);

// 获取当前时间,小时取整,分和秒设为0 使用with将日期设定为指定日期,然后分与秒为0
LocalDateTime now = LocalDateTime.now().with(date).withMinute(0).withSecond(0);


for(int j = 0; j < 24; j++){
    TbProductionLineStopDTO tbProductionLineStopDTO = new TbProductionLineStopDTO();
    if(j == 23){
        // 设置当前日期小时为23,并且格式化
        startTime = now.withHour(23).format(formatter);
        // 天数减1,并且小时设置为0
        endTime = now.plusDays(1).withHour(0).format(formatter);

        starHour = String.format("%02d", j);
        endHour = String.format("%02d", 00);
    }else{
        // 创建 startTime 和 endTime 变量
        startTime = now.withHour(j).format(formatter);
        endTime = now.withHour(j+1).format(formatter);

        starHour = String.format("%02d", j);
        endHour = String.format("%02d", j+1);
    }

    Integer productionCount = realTimeMapper.queryTbProductPassrecord(startTime,endTime,lineCode);
    if(productionCount == null){
        productionCount = 0;
    }
    String time = starHour + "-" + endHour;

    tbProductionLineStopDTO.setLineCount(productionCount);
    tbProductionLineStopDTO.setTimeHour(time);
    tbProductionLineStopDTOList.add(tbProductionLineStopDTO);
}

 

标签:format,int,获取,日期,LocalDateTime,Date,Calendar,now
From: https://www.cnblogs.com/yyk-/p/17440678.html

相关文章

  • @Validated注解的使用
    @Validated注解修饰controller的入参参数上入参参数内部使用其他细节注解进行判断看样例@ApiOperation(value="添加修改ump告警规则")@PostMapping("config")publicResultsaveOrUpdateConfig(@Validated@RequestBodyRadarScreenUmpConfigconfig){ radarScreenUmpS......
  • SpringBoot 项目 返回时间 日期、格式不正确 解决办法
    https://blog.csdn.net/rain67/article/details/127200263 SpringBoot项目返回时间格式不正确解决办法1、遇到问题2、解决方法(1)问题所在(2)如何解决(3)效果SpringBoot项目返回时间格式不正确解决办法  今天做一个SpringBoot+Vue的一个练习项目,想要搞一个创建该账号的时间,......
  • Date 和 Calendar
    //在Java平台首次发布时,它唯一支持日历计算类的就是Date类。//这个类在能力方面是受限的,特别是当需要支持国际化时,它就暴露出了一个基本的设计缺陷:Date 实例是易变的。//在1.1版中,Calendar类被添加到了Java平台中,以矫正Date的缺点,由此大部分的Date方法就都被弃用了。//Date......
  • MySQL中时间函数NOW()和SYSDATE()的区别
    mysql中日期函数还是比较常用的。主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别。NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间。因为NOW()取自mysql的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好了,因此在整个语句......
  • el-date-picker type="daterange" 二个日期之间的range-separator样式
     中间的这个“至”的颜色设置从源代码中可以看出: 这样中间的字的颜色就改为白色了。 ......
  • 分享Python采集40个时间日期,总有一款适合您
    Python采集的40个时间日期下载链接:https://pan.baidu.com/s/1yTUJNe6eFzKcJGsTnJADpA?pwd=jyoi提取码:jyoi简洁易用的JavaScript万年历界面支持节假日高亮显示的时间日期日历表懒人原生format方法格式化Date时间日期支持时、分的日历时间插件效果jQuery简洁版日历插件效果包含节假......
  • Python 中处理日期和时间的模块 datetime
     datetime提供了一些常用的方法。以下是一些常用的 datetime 方法:1.datetime.datetime.now():获取当前时间。例如:datetime.datetime.now() 返回当前时间的 datetime 对象。#test_demo.pyimportdatetimenow=datetime.datetime.now()print(type(now))#<class'......
  • Jmeter函数助手29-dateTimeConvert
    dateTimeConvert函数用于将源格式进行目标格式的转换。格式化时间:传入时间参数,此处格式需要与源时间格式一致源时间格式:传入参数的时间格式目标时间格式:想要转换成的格式 1、将源格式转换成目标格式,注意传入的时间需要与源格式一致。${__dateTimeConvert(${lastday},YYYY......
  • python 日期函数的使用
    计算一段时间内,周六出现的次数。如果是周六,则 5==dt_start.weekday()这里用到了2个主要的日期函数datetime_to_date_int,date_int_to_datetime importdatetimedefdatetime_to_date_int(dt):ifisinstance(dt,datetime.datetime):dt=dt.date()......
  • POJ 2080 Calendar
    题目链接:http://poj.org/problem?id=2080题目不是很难,也没什么说的,直接看代码吧:#include<iostream>#include<stdio.h>usingnamespacestd;intyear(intm){ if(m%4==0&&m%100!=0||m%400==0) return1; else return0;}intmain(){ intn,i,j......