您的位置:首页 > 编程语言 > Java开发

关于时间的操作(Java)

2017-05-31 23:18 387 查看
对于时间操作一般使用Date(时间类)SimpelDateFormat(时间格式类)Calendar(日历接口)三者配合使用。以Date为中心,SimpleDateFormat获取字符串的日期转换为Date 类,再把Date类转换到Calendar类计算后,再转换为Date类,最终转换格式,使用SimpleDateFormat()输出

当遇到类似的开发需求

要求用户输入一个日期,然后对该日期进行一系列的预算

再计算后的日期显示给用户时

流程如下

1.获取用户输入的日期字符串

2.使用SimpleDateFormat将其转换为Date

3.创建一个Calendar,使其表示Date表示的日期

4.使用Calendar转换为一个Date

5.将Calendar转换为Date

6.使用SimpleDateFormat将Date转换为字符串后显示给用户

Date类常用方法和注意事项

1.Date date=new Date();此时date获取的是当前时间

2.long getTime();获取存储在date类中长整形的变量(表示时间)

3.void setTime();把表示时间的长整形的变量存在Date里

代码示例:

import java.util.Date;

/*
* java.util.Date
* Date的每一个实例用于表示一个确切的时间点
* 内部维护了一个long值,该值记录的是从
* 1970年1月1日00:00:00到表示的时间点之间所经历的毫秒值
* 正数是70年以后的日期,负数是70年以前的日期
* 由于date设计上存在缺陷(时区,千年虫),所以它的大部分方法被
* 设置为“过时的”,不再建议使用
*/
public class DemeDemo {

public static void main(String[] args) {
/*
* 使用默认构造方法创建的Date表示当前的系统时间
*/
Date now=new Date();
/*
* Date重写了toString,返回的字符串
* 显示的就是当前Date表示的时间。格式:
* Mon May 29 21:23:58 CST 2017
* 对于非英语地区不够友好
*/
System.out.println(now.toString());
/*
* Date的大部分方法不建议使用了
*/
now.getYear();
/*
* 获取Date内部维护的long值
*/
long time=now.getTime();
System.out.println(time);
//明天这一刻的毫秒值
time+=1000*60*60*24*10000;
System.out.println(new Date(time));
/*
* void setTime(long)
* 设置一个long值,使Date表示该long值
* 所表示的时间
*/
now.setTime(time);
System.out.println(now);
}

}


SimpleDateFormat:

1.构造函数里传入的是格式例如:“yyyy-MM-dd hh:mm:ss”

y:表示年

M:表示月

d:表示日

H:表示小时(12小时制)

h:表示小时(24小时制)

m:表示分钟

s:表示秒

2.String format(Date date)format

方法可以将给定的date对象说表示的时间按照SimpleDateFormat指定的日期格式转换为字符串

3.Date parse(String str)

将给定的字符串按照SimpleDateFormat指定的日期格式解析为一个Date对象。

4.注意!!!使用parse方法时要抛出异常

代码示例:

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

/**
* java.text.SimpleDateFormat
* 根据一个给定日期格式将String与Date相互转换
* simple  简单的
* Format  格式
* @author Analyze
*
*/
public class SimpleDateFormatDemo1 {

public static void main(String[] args) {
//当前系统时间
Date now=new Date();
System.out.println(now);
/*
* 2016-05-25 10:14:55
* yyy-MM-dd HH:mm:ss
*/
SimpleDateFormat sdf=new SimpleDateFormat("y-M-d H:m:s");
/*
* Date->String
* String format(Date date)
* format方法可以将给定的date对象说表示的
* 时间按照SimpleDateFormat指定的日期格式
* 转换为字符串
*/
String str=sdf.format(now);
System.out.println(str);
}

}


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

/**
* 从字符串转换为Date
* Date parse(String str)
* 将给定的字符串按照SimpleDateFormat指定的日期
* 格式解析为一个Date对象
* parse:  解析,从语法上分析
* @author Analyze
*
*/
public class SimpleDateFormat2 {

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");
//String->Date
Date date =sdf.parse(str);
System.out.println(date.toString());
}

}


Calendar:

1.Calendar是一个借口,需要实现。常用的是阳历的实现(用Calendar的静态方法getInstance()方法)

Calendar c=Calendar.getInstance();

2.void set(int field,int value)

其中第一个参数为:时间分量,例如:年月,日等等

第二个参数为对应的值时间分量是一个int值,使用Calendar提供的常量

3.Calendar->Date

Date getTIme()

Calendar提供了方法gerTime,该方法 返回了一个Date对象,该对象表示的时间就是当前Calendar表示的时间

4.Date->Calendar

void setTime(Date date)

Calendar的setTime方法可以使当前Calendar表示给定的Date所表示的时间

5.int get(int field)

获取对应时间分量的值

!!!注意!!!在设置时,获取的月要加1,因为一月是0

因为美国是从星期天开始算起,所以1是星期天

6.getActualMaximum()

获取某一个时间分量所允许的最大值

7.!!!!注意!!例如:

在2017.03.29-31号

新建一个Calendar的単例

设置年:2017

设置月:2

int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH)

得到日期为:3

例如:

在2017.03.01-28号

新建一个Calendar的単例

设置年:2017

设置月:2

int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH)

得到日期为:28

原因:

1.Calendar类当你set的时候,并不会立即生效,set()方法是有延迟,就是当你写这么一段代码时

cal.set(Calendar.MONTH, 5); 它是没有立即生效的。

当调用get()、getTime()、getTimeInMillis()、add() 或 roll()方法时,

才会重新计算日历的时间值(以毫秒为单位)。

解决方法:

实例化Calendar之后,执行clear方法,清除Calendar中的缓存

8.Calendar中计算时间的方法

void add(int field,int value)

对指定的时间分量加上给定的值,若给定的值是负数,则是减去给定的值

示例代码

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

/*
* java.util.Calendar
* 日历类
* 该类是一个抽象类,封装了对时间的相关操作
* 常用的实现类阳历
* 使用日历类是为了对时间进行相关操作
* 比如计算时间
*/
public class CalendarDemo {

public static void main(String[] args) {
/**
* 使用Calendar的静态方法创建实例
* 该方法会更具当前系统时间是在地区创建一个相应
* 的实现,通常是GregorianCalendar
* 默认创建的日历实例表示当前系统时间
*
* instance 实例
*/
Calendar calendar=Calendar.getInstance();
/*
* toString不能直观反映表示的日期
*/
System.out.println(calendar);
/*
* caslendar与Date之间的转换
*
* Calendar->Date
* Date getTIme()
* Calendar提供了方法gerTime,该方法
* 返回了一个Date对象,该对象表示的时间就是
* 当前Calendar表示的时间
*/
Date date=calendar.getTime();
System.out.println(date);
/*
* Date->Calendar
* void setTime(Date date)
* Calendar的setTime方法可以使当前
* Calendar表示给定的Date所表示的时间
*/
//Calendar也表示这一刻了
calendar.setTime(date);
}

}


import java.util.Calendar;

/**
* Calendar提供了针对不同时间分量单独设置值的方法
* void set(int field,int value)
* 其中第一个参数为:时间分量,例如:年月,日等等
* 第二个参数为对应的值
* 时间分量是一个int值,使用Calendar提供的常量
* @author Analyze
*
*/
public class CalendarDemo1 {

public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
System.out.println(calendar.getTime());
/*
* 设置calendar,使其表示
* 2008-08-08  20:08:08
*/
//设定年
calendar.set(Calendar.YEAR, 2008);
System.out.println(calendar.getTime());
/*
* 设置月
* 月从0开始,0表示一月
* 或者可以使用具体月的常量(英文单词)
*/
calendar.set(Calendar.MONTH,7);
System.out.println(calendar.getTime());
/*
* 设置日
* 对应的时间分量常用的:
* DATE:月中天
* DAY_OF_MONTH:月中的天,与DATE一致
* DAY_OF_WEEK:周中的天,星期几
* DAY_OF_YEAR:年中的天
*/
calendar.set(Calendar.DAY_OF_MONTH,8);
System.out.println(calendar.getTime());
/*
* 设置时
* HOUR:12小时制
* HOUR_OF_DAY:24小时制
*/
calendar.set(Calendar.HOUR_OF_DAY,20);
//设置分
calendar.set(Calendar.MINUTE, 8);
//设置秒
calendar.set(Calendar.SECOND, 8);
System.out.println(calendar.getTime());
}

}```


import java.util.Calendar;

/**getActualMaximum()

* 获取某一个时间分量所允许的最大值

* @author Analyze

*

*Actual:实际的,真实的

*Maximum:最大的,极大地

*/

public class CalendarDamo4 {

public static void main(String[] args) {
Calendar calendar=Calendar.getInstance();
//当月总共有多少天
int days=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("最多有"+days+"天");
//查看2016年2月多少天
/*例如:
在2017.03.29-31号
新建一个Calendar的単例
设置年:2017
设置月:2
int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH)
得到日期为:3
例如:
在2017.03.01-28号
新建一个Calendar的単例
设置年:2017
设置月:2
int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH)
得到日期为:28
原因:
1.Calendar类当你set的时候,并不会立即生效,set()方法是有延迟,就是当你写这么一段代码时
cal.set(Calendar.MONTH, 5); 它是没有立即生效的。
当调用get()、getTime()、getTimeInMillis()、add() 或 roll()方法时,
才会重新计算日历的时间值(以毫秒为单位)。
解决方法:
实例化Calendar之后,执行clear方法,清除Calendar中的缓存

*/
calendar.clear();
calendar.set(Calendar.MONDAY, 1);
calendar.set(Calendar.YEAR,2016);
int ss=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(ss);

//今天总共多少天?
days=calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(days);

}


}



import java.util.Calendar;

/**

* Calendar中计算时间的方法

* void add(int field,int value)

* 对指定的时间分量加上给定的值,若给定的值是负数,则是减去给定的值

* @author Analyze

*

*/

public class CalendarDamo5 {

public static void main(String[] args) {
/*
* 查看3年2个月零8天以后的日期
*/
Calendar calendar=Calendar.getInstance();

//查看三年后
calendar.add(Calendar.YEAR, 3);
System.out.println(calendar.getTime());
//查看两个月以后
calendar.add(Calendar.MONTH, 2);
System.out.println(calendar.getTime());
//查看8天以后
calendar.add(Calendar.DAY_OF_YEAR, 8);
System.out.println(calendar.getTime());
//查看五小时以前
calendar.add(Calendar.HOUR,-5);
System.out.println(calendar.getTime());
/*
* 当遇到类似的开发需求
* 要求用户输入一个日期,然后对该日期进行一系列的预算
* 再计算后的日期显示给用户时
* 流程如下
* 1.获取用户输入的日期字符串
* 2.使用SimpleDateFormat将其转换为Date
* 3.创建一个Calendar,使其表示Date表示的日期
* 4.使用Calendar转换为一个Date
* 5.将Calendar转换为Date
* 6.使用SimpleDateFormat将Date转换为字符串后显示给用户
*
*/
}


}

“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 日历 时间 Date