【Java高级特性】java学习之旅32-日期日历类

本文详细介绍了Java中日期和时间的处理,包括Date、Calendar、DateFormat、SimpleDateFormat类的使用,以及JDK 1.8+新增的LocalDateTime等类的操作。还提供了自定义日期工具类的示例,并展示了日期的转换、增减操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Date日期类

表示瞬时的时间,就是时间的偏移量

几个通用的时间

  1. CST: 中国标准时间
  2. UTC: 协调世界时
  3. GMT: 世界时(格林威治时间)

java中时间的起点:1970-1-1 0:0:0:000

常用的方法:

  1. 获取当前的时间
Date date = new Date();
  1. 获取当前时间的偏移量(时间起点至今的毫秒值)
long time = date.getTime();
  1. 通过时间偏移量创建date对象
Date date = new Date(Long.MAX_VALUE);
  1. 其他方法
date.after(date2); //前者在后者之后返回boolean
date.before(date2); //前者在后者之前返回boolean
date.compare(date2); //返回int 若为正数则前者大,以此类推

Calendar 日历类

  1. 是一个抽象类,有一个实现类GregorianCalendar
  2. 通过Calandar.getInstance()获取单例对象

和时间相关的常量

YEAR  年份
MONTH 月份 实际的月份-1
DATE 日期
HOUR 小时
MINUTE 分钟
SECOND 秒
MILLISECOND 毫秒
DAY_OF_WEEK 在一个星期中的周几(日到六 1-7)
DAY_OF_MONTH 在一个月中的日期

常用的方法

  1. 返回指定日历的字段值
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));//2019
  1. 修改指定字段的值
calendar.add(Calendar.YEAR, -1)//2018(-1 表示减去一年)
  1. 设置指定字段的值
calendar.set(Calendar.YEAR, 2022);//2022
  1. 日期类和Calendar类之间的相互转化
Date date = calendar.getTime();

Date date2 = new Date();

calendar.setTime(date2);
作业:输入月份年份打印日历:
public class Work01 {
	
	private static Scanner input = new Scanner(System.in);

	public static void main(String[] args) {
		
		System.out.println("请输入年份:");
		int year = input.nextInt();
		System.out.println("请输入月份:");
		int month = input.nextInt();
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(year, month - 1, 1);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
		
		calendar.add(Calendar.MONTH, 1);
		int nextMonthDayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
		int days = nextMonthDayOfYear - dayOfYear;
		days = days < 0 ? 31 : days;
		
//		System.out.println(dayOfWeek);
//		System.out.println(days);
		
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		for (int j = 0; j < (dayOfWeek == 1 ? 6 : dayOfWeek - 2); j++) {
			System.out.print("\t");
		}
		for (int i = 1; i <= days; i++) {
			System.out.print(i + "\t");
			calendar.set(year, month - 1, i);
			if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
				System.out.println();
			}
		}
	}
	
}

DateFormat 日期格式类

是一个抽象类,有子类SimpleDateFormat

使用getInstance()系类方法获取实例,不同的实例化风格不一样

getInstance(): 19-12-11 下午4:09
getDateInstance(): 2019-12-11
getTimeInstance(): 16:09:56

常用的方法:

  1. 将日期格式化成字符串
Date now = new Date();
DateFormat df1 = DateFormat.getInstance();
String str1 = df1.format(now);
  1. 将符合格式的字符串解析成日期对象
Date date1 = null;
try{
    date1 = df1.parse("19-12-11 ")
} catch(ParseException e){
    e.PrintStackTrace();
}

SimpleDateFormat 类

是DateFormat的子类

使用构造方法创建对象:

  1. 无参构造创建对象和DateFormat.getInstance()获取的实例格式一致
Date date = new Date();

SimpleDateFormat sdf = new SimpleDateFormat();

sdf.format(date);
  1. 一般使用有参
字符含义
yyyy
MM
dd
HH时 (hh是12小时制度)
mm
ss
SSS毫秒

常用方法

  1. format(Date date): 将日期对象格式化成字符串
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.format(now)
  1. parse(String str): 将符合格式的字符串解析成日期对象
String str = "1999-5-11 12:12:12.123";
Date date = null;
try{
    date = sdf.parse(str);
} catch(ParseException e){
    e.printStackTrace();
}

jdk 1.8+ 新日期类

LocalDateTime\LocalDate\LocalTime

注意:

  1. Date和Calendar类都在java.util包下,新日期类在java.timr包下
  2. 内部有一个私有的无参构造,不能new对象

常用的方法:

  1. 获取当前的时间 now()
LocalDateTime now = LocalDateTime.now();
  1. 根据指定日期创建对象 of()
LocalDateTime ldt = LocalDateTime.of(2019, 12, 12, 9, 8 ,8)
  1. 一系列的getter方法,用于获取日期相关字段值
System.out.println(ldt.getYear());
  1. 提供了一系列plus方法:用于计算日期,每次计算都会返回一个新的对象,不会修改原来的对象
LocalDateTime newLdt = ldt.plusDays(7);
  1. 日期对象格式化为字符串
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分ss秒");

String nowStr = now.format(dtf);

String nowStr1. format(now);

DateTimeFormatter 类

  1. jdk 1.8+
  2. DateFoamat 和 SimpleDateFormat都在java.text包下,DateTimeFormatter在java.time.format包下

常用方法:

  1. 根据指定格式化样式创建格式化器对象
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  1. 格式化日期对象
dtf.format(LocalTimeFormatter.now());
重点:LocalDateTime 和 Date 之间的相互转换

这里需要补充一个类:Instance

  1. jdk 1.8 +
  2. 瞬时类、时间戳、时刻类

Date -> LocalDateTime

@Test
public void test(){
    Date date = new Date();
    Instance instance = date.toInstance();
    //选择时区
    ZoneId zonId = ZoneId.systemDefault();
    LocalDateTime ldt = instance.atZone(zonId).toLocalDateTime();
}

LocalDateTime -> Date

@Test
public void test(){
    LocalDateTime ldt = LocalDateTime.now();
    ZoneId zoneId = ZoneId.systemDefault();
    Instance instance = ldt.atZone(zoneId).toInstance();
    Date date = Date.from(instance);
}

实际项目自定义一个日期的工具类:

/**
 * 自定义日期工具类
 */
 
 public final class MyDateUtil {
 
     private MyDateUtil() {
     }
     
      /**
      * Date转LocalDateTime
      * @Param date 传入Date对象
      * @return LocalDateTime 对象
      */
      public static LocalDateTime dateToLocalDateTime(Date date){
          return date.toInstance().atZine(ZoneId.systemDefault()).toLocalDateTime();
      }
      
      /**
       * LocalDateTime转Date
       * @Param localDateTime 传入LocalDateTime对象
       * @return Date对象
       */
       public static Date localDateTimeToData(LocalDateTime localDateTime) {
           return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
       }
       
       /**
        * date 转 calendar
        * @param date
        * @return Calendar对象
        */
        public static Calendar dateToCalendar(Date date){
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return calendar;
            }
            
       /**
        * Calendar转date
        * @param calendar
        * @return Date对象
        */
        public static Date calendarToDate(Calendar calendar){
            return calendar.getTime();
        }
        
       /**
        * date增加天数
        * @param date
        * @return Date对象
        */
        public static Date addDays(Date date, int days){
            Calendar calendar = dateToCalendar(date);
            calendar.add(Calendar.DAY_OF_MONTH, days);
            return date;
        }
        
       /**
        * date增加月份
        * @param date
        * @return Date对象
        */
        public static Date addMonths(Date date, int months){
            Calendar calendar = dateToCalendar(date);
            calendar.add(Calendar.MONTH, months);
            return date;
        }
        
       /**
        * date增加年数
        * @param date
        * @return Date对象
        */
        public static Date addYears(Date date, int years){
            Calendar calendar = dateToCalendar(date);
            calendar.add(Calendar.Year, years);
            return date;
        }
        
       /**
        * date增加年月日时分秒
        * @param date
        * @return Date对象
        * @throws Exception
        */
        public static Date add(Date date, int... params) throws Exception{
            if(params.length > 7 || params.length < 1){
                throw new Exception("参数必须是1-7");
            }
            
            int[] calendarValues = {
                Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH,
                Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calensdar.MILLISECOND
            };
            
            Calendar calendar = dateToCalendar(date);
            for(int i = 0; i < param.length; i++){
                calendar.add(calendarValue[i], params[i]);
            }
            
            return calendarToDate(calendar);
        }
 }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值