Java日期操作(Date SimpleDateFormat Calender)

Java日期操作

Java中的时间

Java中的时间使用标准类库的Date类表示
是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点

固定的时间点叫纪元( epoch) , 是UTC时间1970年1月1日00:00:00

UTC(Universal Time Coordinated世界调整时间)
与GMT(Greenwich Mean Time格林威治时间)一样

是一种具有实际目的的科学标准时间

Java日期操作的常用类

Date

SimpleDateFormat

Calender

Date

java.util.Date类封装日期及时间信息
Date类的大多数用于进行时间分量计算的方法已经被Calendar取代。

Date的每一个实例用于表示一个确切的时间(精度为毫秒)

内部维护一个long值
该值表示的自1970年1月1日00:00:00到当前Date表示的时间之间所经过的毫秒

Date存在时区等设计缺陷,因此大部分方法都被声明为过时的,在以后的开发中不应当使用

常用API

long getTime() 获取Date内部维护的毫秒值

date.setTime(long l) 设置时间Date时间,从UTC时间的初始值开始设置
如果传入参数为零,则时间为1970年1月1日00:00:00

package date;
import java.util.Date;
public class DateDemo {
	public static void main(String[] args) {
		Date date = new Date();
		System.out.println(date);
        //获取Date内部维护的毫秒值
		long time = date.getTime();
		System.out.println(time);
		//设置时间归零,最初始的时间
		date.setTime(0);
		System.out.println(date);
	}
}

SimpleDateFormat

java.text.SimpleDateFormat

该类可以将Date与String之间按照指定格式进行互相转换

SimpleDateFormat是个以与语言环境有关的方式来格式化和解析日期的具体类
它允许进行格式化(日期–>文本)、解析(文本–>日期)和规范化

构造方法
SimpleDateFormat ( )
SimpleDateFormat ( String pattern )用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat

将Date按格式解析成String(format)

String format(Date date) 将给定的Date对象按照当前SDF指定的日期格式转换为字符串

package date;

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

public class SimpleDateFormatDemo1 {
	public static void main(String[] args) {
		Date now = new Date();
		System.out.println(now);
		/*
		 * 转化格式为:
		 * 2008-08-08 20:08:08
		 * yyyy-MM-dd HH:mm:ss
		 */
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String line = sdf.format(now);
		System.out.println(line);
	}
}

将正确格式的String解析成对应的Date(parse)

Date parse(String str) 将给定的String对象按照当前SDF指定的日期格式转换为Date
注意:这里需要抛出异常(ParseException),字符串如果不符合该格式,会抛出该异常

package date;

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

public class SimpleDateFormatDemo2 {
	public static void main(String[] args) throws ParseException {
		String str = "2008-08-08 20:08:08";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //将字符串按格式转换为Date
		Date date = sdf.parse(str);
		System.out.println(date);
	}
}

日期模式匹配字符(注意大小写)

字符含义示例
yyyyy年-1997年;yy-97年
MMM月-09月;M月-9月
ddd日-07日;d日-7日;
dd日27日;d日-27日
E星期E-星期日(sun)
aAM或PM标识a-下午(PM)
H小时(24小时制)HH-14
h小时(12小时制)hh(a)-2(下午pm)
m分钟mm-60
sss-60

上述的可以只写一个(M、d、m、s),这里按照我们具体需要获取的格式需求来写
这样写超过一位的会显示两位,不超过一位的,不会显示前面的0

package date;

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

/**
 * 测试日期模式匹配字符
 * @author Tian
 *
 */
public class SimpleDateFormatDemo3 {
	public static void main(String[] args) {
		//获取当前时间
		Date date = new Date();
		//设置转化格式
		SimpleDateFormat sdf1 = new SimpleDateFormat("yy-M-d");
		System.out.println(sdf1.format(date));//19-8-21
		
		SimpleDateFormat sdf2 = new SimpleDateFormat("E");
		System.out.println(sdf2.format(date));//星期三
		
		SimpleDateFormat sdf3 = new SimpleDateFormat("a");
		System.out.println(sdf3.format(date));//下午
		
		SimpleDateFormat sdf4 = new SimpleDateFormat("a hh:m:s");
		System.out.println(sdf4.format(date));//下午 07:29:9
	}
}

Calendar

java.util.Calendar 日历类

Calendar是一个抽象类,规定了日历操作时间的一系列方法

可以使用其提供的静态方法:getInstance来获取一个当前系统所在地区适用的实现类

大部分地区获取回来的是GregorianCalendar(格里高利历,即公历)

创建Calendar对象(getInstance)

可以使用其提供的静态方法:getInstance来获取一个当前系统所在地区适用的实现类
大部分地区获取回来的是GregorianCalendar(格里高利历,即公历)

		Calendar calendar = Calendar.getInstance();
		System.out.println(calendar);

Calendar与Date互相转换(getTime与setTime)

Date getTime() 可以将当前Calendar表示的日期以一个Date实例形式返回

void setTime(Date date) 调整当前Calendaar使其表示给定Date所表示的日期

package date;

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

public class CalendarDemo1 {
	public static void main(String[] args) {
        //创建一个Calendar
		Calendar calendar = Calendar.getInstance();
		//将当前Calendar表示的日期以一个Date实例形式返回
		Date date = calendar.getTime();
		System.out.println(date);
		//调整当前Calendaar使其表示给定Date所表示的日期
		calendar.setTime(date);
		System.out.println(calendar);
	}
}

获取Calendar中的值(get)

int get(int field) 获取当前Calendar表示的日期中指定时间分量所对应的值

不同的时间分量用不同的整数表示,无需记忆,Calendar提供了大量的常量与之对应

int getActualMaximum(int field) 获取指定时间分量所允许的最大值,会自动根据年份和月份判断多少天

package date;

import java.util.Calendar;

public class CalendarDemo2 {
	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();
		//获取年
		int year = calendar.get(Calendar.YEAR);//其常量为1
		
		//获取月
		//int month = calendar.get(Calendar.MONTH);//发现少一个月
		//注意获取的月是从0开始取的,所以需要加1(不要问我为什么,就这么设计的)
		int month = calendar.get(Calendar.MONTH)+1;
		
		//获取天
		/*
		 * 和天相关的时间分量
		 * DAY_OF_YEAR:当前年的第几天
		 * DAY_OF_MONTH:当前月的第几天
		 * DAY_OF_WEEK:当前周的第几天
		 * DATE:月中的天,与DAY_OF_MONTH一致
		 */
		int day = calendar.get(Calendar.DATE);
		System.out.println(year+"年"+month+"月"+day+"号");
		//获取年中天
		int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
		System.out.println("今天是今年的第"+dayOfYear+"天");
		//获取月中天
		int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
		System.out.println("今天是这个月的第"+dayOfMonth+"天");
		//获取周中天
		//注意:按照美国的习惯,一周的第一天是周日(所以需要减一)
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
		System.out.println("今天是本周的第"+dayOfWeek+"天");
		//可以通过数组对应为汉字
		String[] days = {"日","一","二","三","四","五","六"};
		System.out.println("今天是周"+days[dayOfWeek]);
		
		//获取时分秒
		//获取小时
		//HOUR为12小时制,HOUR_OF_DAY为24小时制(即一天中的第几个小时)
		int h1 = calendar.get(Calendar.HOUR);
		int h2 = calendar.get(Calendar.HOUR_OF_DAY);
		//获取分
		int m = calendar.get(Calendar.MINUTE);
		//获取秒
		int s = calendar.get(Calendar.SECOND);
		System.out.println("当前时间(12小时制)"+h1+":"+m+":"+s);
		System.out.println("当前时间(24小时制)"+h2+":"+m+":"+s);
		
		/*
		 * int getActualMaximum(int field)
		 * 获取指定时间分量所允许的最大值
		 * 会自动根据年份和月份判断多少天
		 */
		int d1 = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
		int d2 = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println("今年共"+d1+"天,该月共"+d2+"天");
	}
}

调整Calendar中的时间(set)

void set(int field, int value) 调整当前Calendar指定的时间分量为给定的值

其强大的地方是,如果我们设置的时间超过了应该的值,会自动进位
比如一个月设置成了32天,这个月只有31天,那么会进位到下个月的1号

package date;

import java.util.Calendar;

public class CalendarDemo3 {
	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();
		System.out.println(calendar.getTime());	
		/*
		 * 调整时间为 1997-09-27 20:08:08
		 */
		//调整年
		calendar.set(Calendar.YEAR, 1997);
		//调整月(注意月从0开始,8月要设置为7)
		calendar.set(Calendar.MONTH, 8);
		//调整日
		calendar.set(Calendar.DATE, 27);
		System.out.println("调整后的时间为:"+calendar.getTime());

		//上述可以一起调整(这里随便调整个时间,以作区分)
		calendar.set(1998, 2, 27);
		System.out.println("调整后的时间为:"+calendar.getTime());
		
		//一起调整为2008-08-08 20:08:08
		calendar.set(1997, 8, 27, 20, 8, 8);
		System.out.println("调整后的时间为:"+calendar.getTime());
		
		//设置的时间超过了会自动进位,这里月份设置超过了3个月
		//时间从1997-09-27变为了1998-03-27
		calendar.set(1997, 14, 27, 20, 8, 8);
		System.out.println("调整后的时间为:"+calendar.getTime());
	}
}

对Calendar添加时间量(add)

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

package date;

import java.util.Calendar;

public class CalendarDemo4 {
	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();
		System.out.println(calendar.getTime());
		//查看3年前,2个月零25天以后,那天所在周的周三
		//减3年
		calendar.add(Calendar.YEAR, -3);
		System.out.println("3年前:"+calendar.getTime());
		//加2个月
		calendar.add(Calendar.MONTH, 2);
		System.out.println("2个月后:"+calendar.getTime());
		//加25天
		//calendar.add(Calendar.DATE, 25);
		calendar.add(Calendar.DAY_OF_YEAR, 25);
		System.out.println("25天后:"+calendar.getTime());
		//设置为当周的周三
		calendar.set(Calendar.DAY_OF_WEEK, 4);
		System.out.println("这周的周三:"+calendar.getTime());
	}
}

练习

练习一

程序启动后,要求用户输入自己的生日

格式为:yyyy-MM-dd

然后经过程序计算,输出到今天为止一共活了多少天

然后再输出其出生10000天的纪念日是哪天,输出格式同上

package date;

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

public class Test {
	public static void main(String[] args) throws ParseException {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入你的生日:");
		String birth = scan.nextLine();
		//设置转换格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		//根据输入的生日字符串转化为对应的日期格式
		Date birthDate = sdf.parse(birth);
		//获取现在的日期
		Date now = new Date();
		//计算到现在所过的毫秒值
		long day = now.getTime()-birthDate.getTime();
		//根据毫秒值算出天数
		System.out.println("您已经活了"+(day/1000/60/60/24)+"天");
		//获取生日加上10000天的毫秒值(注意long类型的溢出问题,在第一个相乘的数字后加上l)
		long time = birthDate.getTime()+10000l*24*60*60*1000;
		//利用日期的参构造器将日期设置为生日和10000天的毫秒值
		Date date = new Date(time);
		//格式化输出
		System.out.println(sdf.format(date));
	}
}

练习二

计算商品促销日期

程序启动后,要求用户输入商品生产日期:yyyy-MM-dd

再输入商品的保质期天数,为一个整数

然后经过计算,输出该商品促销日期,格式同上

规则:商品过期日前两周的周三为促销日期

package date;

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

public class Test2 {
	public static void main(String[] args) throws ParseException {
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入商品生产日期(yyyy-MM-dd)");
		String birthDate = scan.nextLine();
		System.out.println("请输入该商品的保质天数(整数):");
		int day = scan.nextInt();
		//设置日期转换格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		//将生产日期转换为date
		Date startDate = sdf.parse(birthDate);
		//创建一个Calendar类
		Calendar date = Calendar.getInstance();
		//将该日期转换为Calendar
		date.setTime(startDate);
		//对该日期加上保质天数
		date.add(Calendar.DAY_OF_YEAR, day);
		//格式化输出该日期(保质期)
		System.out.println("保质期为:"+sdf.format(date.getTime()));
		//计算该商品的促销日期
		date.add(Calendar.WEEK_OF_YEAR, -2);
		date.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
		//格式化输出促销日
		System.out.println("促销日为:"+sdf.format(date.getTime()));
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值