Java日期,日期格式,历法的小总结(菜鸟的我学习Java,欢迎批评指正哦)

时间:2022-03-02 14:40:40
package JavaTest;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class MyClassTest {
public static void main(String[] args) {
System.out.println("这是dateTest==========================================================");
dateTest();
System.out.println("");

System.out.println("这是simpleDateFormatTest==============================================");
simpleDateFormatTest();
System.out.println("");

System.out.println("这是calendarTest======================================================");
calendarTest();
System.out.println("");
}

/**
* 日期测试
*/

static void dateTest() {
// 目前按照构造器来获得日期的只有这两种方法了,其他的均已过时,最好不用,因为可能是有bug才会丢弃
Date date = new Date();
Date date2 = new Date(60000000000000000L);

System.out.println("date ================== " + date);
System.out.println("date2 ================== " + date2);

long time = date.getTime();
System.out.println("time ====================" + time);

// 一直获取当前时间:年月日 时分秒
Instant instant = Instant.now();
Date time3 = Date.from(instant);
System.out.println("time3 ====================" + time3);

/*
* 比较大小或者相等,b可取值为>0, <0, ==0
*/

int b = date.compareTo(date2);
int b2 = date.compareTo(time3);
System.out.println("b ====================" + b);
System.out.println("b2 ====================" + b2);
}

/**
* 日期格式测试
*/

static void simpleDateFormatTest() {

String instant = "2016年07月25日 14时29分29秒";// 我们自己弄一个日期字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时dd分mm秒");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy.MM.dd HH:dd:mm");

try {
// 1.将字符串转为日期时,字符串格式一定要和SimpleDateFormat的格式一致,否则报异常
// 2.这也就是说,通过SimpleDateFormat,你可以将任意格式的日期字符串转化为日期,但是要注意第1
Date date = sdf.parse(instant);
// 发现没有?这其实是另外一种获得日期实例的方法,通过格式化你自己的日期字符串获取日期
System.out.println("date ====================" + date);

// 3.而对于一个日期,你可以将其转为任意格式的字符串日期
// 目前我只发现日期格式不能用英文连接,只要是特殊字符(中文属于特殊字符)就可以连接
String dateString = sdf2.format(date);
System.out.println("dateString ====================" + dateString);
} catch (ParseException e) {
e.printStackTrace();
}
}

/**
* 历法测试,jdk1.1之后建立使用历法获取日历,在这个测试中会提到怎么获取
*/

static void calendarTest() {
// 1.由于Calendar是一个抽象类,所以使用子类构造器获取的,这是获取罗马历法的日历
Calendar calendar = new GregorianCalendar();
// 2.或者单例获取,默认获取历法,也可以使用有参方法指定你想要的历法
// 这个单例方法有很多重载,你可以根据自己的需要来选择
Calendar calendar2 = Calendar.getInstance(Locale.CHINA);

// 获取指定字段值,获取年份
int year = calendar2.get(Calendar.YEAR);
System.out.println("获取年份 ====================" + year);
// 获取月份,月份0-11
int month = calendar2.get(Calendar.MONTH);
System.out.println("获取月份 ====================" + month);
// 获取天份
int day = calendar2.get(Calendar.DAY_OF_MONTH);
System.out.println("获取天份 ====================" + day);
// 指示当前月中的第几个星期
int dayOfWeekInMonth = calendar2.get(Calendar.DAY_OF_WEEK_IN_MONTH);
System.out.println("指示当前月中的第几个星期 ====================" + dayOfWeekInMonth);
// 获取小时
int hour = calendar2.get(Calendar.HOUR);
System.out.println("获取小时 ====================" + hour);
// 获取分钟
int minute = calendar2.get(Calendar.MINUTE);
System.out.println("获取分钟 ====================" + minute);
// 获取秒
int millisecond = calendar2.get(Calendar.MILLISECOND);
System.out.println("获取秒 ====================" + millisecond);
// 获取当前月中的星期数
int week = calendar2.get(Calendar.WEEK_OF_MONTH);
System.out.println("获取获取周 ====================" + week);
// 获取星期一
int monday = calendar2.get(Calendar.MONDAY);
System.out.println("获取星期一 ====================" + monday);
/*
* 请注意,这里面的这些字段都是通用的,不需要你自己另外指定新的字段或者get()里面放你自己的参数
*/


// 第四种获取日期实例的方法:获得表示相同时间的 Date类型实例,jdk1.1之后提倡通过历法获得Date实例
Date date = calendar2.getTime();
String instant = "2016-06-07 16:22:22";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:dd:mm");
Date date2 = null;
try {
date2 = sdf.parse(instant);
// 设置指定的时间
calendar2.setTime(date2);
Date date3 = calendar2.getTime();
System.out.println("获取自定义设置后重新生成的日期 ====================" + date3);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String dateString = sdf.format(date);
System.out.println("查看自定义设置后重新生成的日期字符串格式 ====================" + dateString);

// 修改指定字段的值
calendar2.set(Calendar.YEAR, 2019);
int year2 = calendar2.get(Calendar.YEAR);
System.out.println("获取设置后生成的年份====================" + year2);

// 设置年月入时分秒,也可以适当减少部分参数,按要求设置
calendar2.set(2077, 10, 30, 12, 12, 12);
int year3 = calendar2.get(Calendar.YEAR);
System.out.println("获取获取另一种方法设置后生成的年份 ====================" + year3);

// 在指定字段上添加一个值
calendar2.add(Calendar.MONTH, 1);
int month2 = calendar2.get(Calendar.MONTH);
System.out.println("获取添加后生成的月份 ====================" + month2);

// add方法与roll方法的区别
// add方法会改变更大的值,比如增加月份超过12了,年份就会跳到下一年,即add会改变更大一级的值
// roll方法则不然,就算月份回滚超过12了,年份也还是在本年度中,只是月份会改变,即回滚不会改变更大一级的值
calendar2.add(Calendar.MONTH, 15);
int yearAdd = calendar2.get(Calendar.YEAR);
// 这里的月份会增加到2079
System.out.println("增加月份后的年份 ====================" + yearAdd);

calendar2.roll(Calendar.MONTH, +15);
int yearRoll = calendar2.get(Calendar.YEAR);
// 按道理这里的月份会增加到2081,但是由于回滚不增加更大一级的值,所以年份依然是2079
System.out.println("回滚月份后的年份 ====================" + yearRoll);

// 其他的历法API都是见名知义的方法了,不需要意义解释了
// 解释一下getActualMaximum,getActualMinimum,getMaximum,getMinimum
// 返回月份中的最大天数
int monthRoll = calendar2.get(Calendar.MONTH);// 返回值是5,说明是六月份
System.out.println("获取回滚后的月份 ====================" + monthRoll);

// 返回当前月:6月份的最大天数
int maxMonth = calendar2.getActualMaximum(Calendar.DATE);
int maxMonth2 = calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("获取月份中最大值 ====================" + maxMonth);// 30
System.out.println("获取月份中最大值2 ====================" + maxMonth2);// 30

// 返回月份的最大天数
int maxMonthNum = calendar2.getMaximum(Calendar.DATE);// 31
int maxMonthNUm2 = calendar2.getMaximum(Calendar.DAY_OF_MONTH);// 31
System.out.println("获取月份中最大值 ====================" + maxMonthNum);
System.out.println("获取月份中最大值2 ====================" + maxMonthNUm2);

// 这里可以看出getActualMaximum返回的是当前的实际数值
// 而getMaximum返回的是可能的最大值
// 对应的getActualMinimum,getMinimum也是一样的
}
}