10.11-Java中的时间与日期
Date类(java.util.Date)
该类的每一个实例用来描述时间(只能描述,不能操作)
其内部维护了一个long值。记录值自1970年1月1日到当前时间的毫秒差
例子
package day10_11;
import java.util.Date;
public class DateDemo {
/**
* Date类在设计上存在两个问题
* 1.时区
* 2.千年虫(计算机处理时间的BUG)
*/
public static void main(String[] args) {
/*
* 无参构造器 Date()
* 该构造器创建出的对象默认表示当前系统时间
*/
Date now = new Date();
System.out.println(now);
/*
* long getTime()
* 获取当前date对象描述的时间距离1970年1月1日的毫秒差
*/
long ms = now.getTime();
System.out.println(ms);
//计算明天这一刻的毫秒值
ms+=24*60*60*1000;
/*
* 有参构造器 Date(long time)
* 创建一个date对象来描述给定毫秒值所表示的时间
*/
Date td = new Date(ms);
System.out.println(td);
/*
* void setTime(long time)
* 使当前Date对象描述给定毫秒值所表示的时间
*/
now.setTime(ms);
System.out.println(now);
}
}
SimpleDateFormat类
使用一个特殊的字符串来描述一个时间格式
并使用该时间格式作为桥梁再Date与String相互转换
Date<--SimpleDateFormat(桥梁类)-->String类
时间格式字符串中使用的特殊字符
y
表示年份yy
两位数年份yyyy
四位数年份
M
表示月MM
表示两位数的月份
d
表示日dd
表示两位数的日期
h
表示小时(12小时制)H
表示小时(24小时制)hh
/HH
表示两位数的小时
m
表示分钟mm
表示两位数的分钟
s
表示秒ss
表示两位数的秒
E
表示星期a
表示上下午
注意:在一个时间格式容器中出现的其他字符按意愿来显示
例子一:Date对象转换为字符串
package day10_11;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) {
Date now = new Date();
System.out.println(now);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH时mm分ss秒 E a");
/*
* String format(Date date)
* 将给定的date对象描述的时间按照指定的时间格式转换为字符串
*/
String str = sdf.format(now);
System.out.println(str);
}
}
例子二:字符串转换为Date对象
package day10_11;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo02 {
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 parse(String str)
* 将给定的字符串按指定日期格式解析成对应的Date对象
*/
Date date = sdf.parse(str);
System.out.println(date);
}
}
DateFormat类
该类可以根据给定的地区将Date转换为String
不同的地区对应的时间格式字符串是预定义的
例子
package day10_11;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
public class DateFormatDemo {
public static void main(String[] args) {
Date now = new Date();
System.out.println(now);
// DateFormat df = new DateFormat();
/*
* 创建DateDormat类型的实例使用其自身提供的工厂方法
* getDateInstance()
* style:打印时间的样式
* aLocale:
*/
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.ENGLISH);
String str = df.format(now);
System.out.println(str);
}
}
Calendar类
日历类,用于操作时间
Calendar类是一个抽象类,不能直接实例化
使用其自身提供的工厂方法
getInstance()
来获取实例该方法会根据当前系统所在地区,自动判定应该使用哪一个子类实现
例子
package day03;
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo01 {
public static void main(String[] args) {
//通过工厂方法获取Calendar类型的实例
Calendar calendar = Calendar.getInstance();
//格林高利历法(阳历)
// Calendar calendar = new GregorianCalendar();
//默认情况下创建出来的Calendar对象表示当前的系统时间
System.out.println(calendar);
/*
* 查看calendar时间,通过输出该对象得到的
* 字符串不友好,可以先将Calendar转换为Date
* Date getTime()
* 将当前Calendar对象描述的时间转换
* 为一个Date对象并返回
*/
Date date = calendar.getTime();
System.out.println(date);
long ms = date.getTime();
System.out.println(ms);
//计算明天这一刻的毫秒值
ms+=24*60*60*1000;
date.setTime(ms);
System.out.println(date);
/*
* void setTime(Date date)
* 使当前Calendar对象描述给定Date
* 对象所表示的时间
*/
calendar.setTime(date);
System.out.println(calendar);
}
}
操作时间的方式
获取某个时间单位的值(get)
给某个时间单位设置值(set)
计算时间 (add)
例子-获取某个时间单位的值(get)
package day03;
import java.util.Calendar;
public class CalendarDemo02 {
//获取某个时间单位的值
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
/*
* int get(int field)
* field该参数对应Calendar提供的若干常量,
* 每一个常量就表示一个不同的时间单位
*/
//获取年份
int year = calendar.get(Calendar.YEAR);
System.out.println(year);
//获取月份
int month = calendar.get(Calendar.MONTH);
//月份从0开始算起,0表示1月
System.out.println(month);//9
/*
* 对于天而言有以下中时间分量:
* Calendar.DATE 几号
* Calendar.DAY_OF_MONTH 月中天
* Calendar.DAY_OF_WEEK 周中天
* Calendar.DAY_OF_YEAR 年中天
*/
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
/*
* 对于星期而言符合美国习惯:
* 周日为一周的第一天
*/
int dow = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("星期"+(dow==1?7:dow-1));
int td = calendar.get(Calendar.WEEK_OF_MONTH);
System.out.println(td);
}
}
例子-给某个时间单位设置值(set)
package day03;
import java.util.Calendar;
public class CalendarDemo03 {
//给某个时间单位设置值
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
/*
* void set(int field,int value)
* 将给定的时间单位设置给定的值
*/
//设置年份为2008年
calendar.set(Calendar.YEAR,2008);
//设置月份为8月,月份从0算起
// calendar.set(Calendar.MONTH,7);
calendar.set(Calendar.MONTH,Calendar.AUGUST);
//设置日期为8号
// calendar.set(Calendar.DAY_OF_MONTH,8);
/*
* 当给定的时间分量对应的值超出当前时间
* 分量所允许的最大值时,会自动进位
*/
calendar.set(Calendar.DAY_OF_MONTH,32);
System.out.println(calendar.getTime());
}
}
例子-计算时间 (add)
package day03;
import java.util.Calendar;
public class CalendarDemo04 {
//计算时间
public static void main(String[] args) {
//计算该月的月底:下个月的1号减去1天
Calendar calendar = Calendar.getInstance();
/*
* void add(int field,int value)
* 将给定的时间分量累加给定的值
*/
//将月份往后推1个月
calendar.add(Calendar.MONTH,1);
//将日期设置为1号
calendar.set(Calendar.DATE,1);
//将天往前推1天
calendar.add(Calendar.DAY_OF_MONTH,-1);
System.out.println(calendar.getTime());
}
}
综合练习
计算商品的促销日期: * 1.在控制台输入商品的生产日期(yyyy-MM-dd) * 2.在控制台输入商品的保质期天数 * 3.计算促销日期:(yyyy-MM-dd),促销日期是商品到期日的那一个星期的前两个星期的星期三
package day03;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class CalendarDemo05 {
/**
* 计算商品的促销日期:
* 1.在控制台输入商品的生产日期(yyyy-MM-dd)
* 2.在控制台输入商品的保质期天数
* 3.计算促销日期:(yyyy-MM-dd)
* 是商品到期日的那一个星期的前两个星期的星期三
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入商品的生产日期:");
String proString = sc.nextLine();
Scanner s = new Scanner(System.in);
System.out.println("请输入商品的保质期天数:");
int days = s.nextInt();
//将String类型的生产日期转换为Calendar类型
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
Date proDate = sdf.parse(proString);
Calendar proCalendar = Calendar.getInstance();
proCalendar.setTime(proDate);
//求商品的到期日
proCalendar.add(Calendar.DAY_OF_YEAR,days);
//将星期数往前推2周(将天数往前推14天)
proCalendar.add(Calendar.WEEK_OF_YEAR,-2);
// proCalendar.add(Calendar.DAY_OF_YEAR,-14);
//将星期数设置为周三
proCalendar.set(Calendar.DAY_OF_WEEK,Calendar.WEDNESDAY);
//将Calendar类型的促销日期转换为String
proDate = proCalendar.getTime();
proString = sdf.format(proDate);
System.out.println("促销日期:"+proString);
}
}
总结
String/Date/Calendar三者之间的关系
String
->SimpleDateFormat.parse()
->Date
Date
->Calendar.setTime()
->Calendar
Calendar
->Calendar.getTime()
->Date
Date
->SimpleDateFormat.parse()
->String
最后更新于