java中date类_Java中Date类和Calendar类的常用实例小结

前言写后台程序的时候,经常需要存储当前服务器的时间戳,使用时间戳也很方便,客户端和服务器端都可以根据自己的需求做各自的转换

在php里,获取当前时间戳使用time()函数,格式化输出通过Date()函数即可,Java里相对复杂一些,这里简单介绍一下

Java语言中的Calendar,Date,DateFormat组成了Java标准的一个基本但是非常重要的部分。日期是商业逻辑计算一个关键的部分,所有的开发者都应该能计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象

获取UNIX时间戳在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期的处理。这里简单介绍一下用Date类如何获取当前时间戳

使用系统的当前日期和时间创建一个日期对象并返回一个长整数,这个时间通常称为Java 虚拟机(JVM)主机环境的系统时间,单位是毫秒,因此需要除以1000转换成UNIX时间戳

import java.util.Date;

public class TimeTest {

public static void main(String args[]) {

Date time = new Date();

System.out.println(time.getTime() / 1000); // 1387258105

System.out.println(time.toString()); // Tue Dec 17 13:28:25 CST 2013

}

}

格式化日期php里可以使用Date()函数定制日期数据的格式用于呈现,Java里需要调用SimpleDateFormat类,例如将当前时间格式化输出:

import java.text.SimpleDateFormat;

import java.util.Date;

public class TimeTest {

public static void main(String args[]) {

Date time = new Date();

System.out.println(time.getTime() / 1000); // 1387260201

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); // 2013-03-17 14:03:21

String str = sdf.format(time);

System.out.println(str);

}

}

将文本解析成日期对象给定了格式化的时间字符串,例如“2013-12-17 14:05:59”,需要将其转换成Date对象,便于获取时间戳获取进行其它格式化操作,可以继续调用SimpleDateFormat类

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

public class TimeTest {

public static void main(String args[]) {

String text = "2013-12-17 14:05:59";

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try {

Date time = sdf.parse(text);

System.out.println(time.getTime() / 1000);

} catch(ParseException e) {

System.out.println(e.getMessage());

}

}

}

获取日期的特定部分通过Date和SimpleDateFormat两个类,我们已经可以实现获取当前时间戳,日期格式化输出,格式化日期字符串转Date对象功能,现在还有一个新的需求,如何获取日期的特定部分,例如当前的小时,当前的天数等,这就需要用到Calendar类了

import java.util.Calendar;

import java.util.Date;

import java.util.GregorianCalendar;

public class TimeTest {

public static void main(String args[]) {

Date date = new Date();

GregorianCalendar gcalendar = new GregorianCalendar();

gcalendar.setTime(date);

int year = gcalendar.get(Calendar.YEAR);

int month = gcalendar.get(Calendar.MONTH);

int day = gcalendar.get(Calendar.DAY_OF_MONTH);

int hour = gcalendar.get(Calendar.HOUR_OF_DAY);

int minute = gcalendar.get(Calendar.MINUTE);

int second = gcalendar.get(Calendar.MINUTE);

System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":"

+ second);

}

}

计算两个日期之间相差的天数

例如计算2010年4月1号和2009年3月11号之间相差的天数,则可以使用时间和日期处理进行计算。

该程序实现的原理为:首先代表两个特定的时间点,这里使用Calendar的对象进行代表,然后将两个时间点转换为对应的相对时间,求两个时间点相对时间的差值,然后除以1天的毫秒数(24小时X60分钟X60秒X1000毫秒)即可获得对应的天数。实现该示例的完整代码如下:

import java.util.*;

/**

* 计算两个日期之间相差的天数

*/

public class DateExample1 {

public static void main(String[] args) {

//设置两个日期

//日期:2009年3月11号

Calendar c1 = Calendar.getInstance();

c1.set(2009, 3 - 1, 11);

//日期:2010年4月1号

Calendar c2 = Calendar.getInstance();

c2.set(2010, 4 - 1, 1);

//转换为相对时间

long t1 = c1.getTimeInMillis();

long t2 = c2.getTimeInMillis();

//计算天数

long days = (t2 - t1)/(24 * 60 * 60 * 1000);

System.out.println(days);

}

}

输出当前月的月历

该示例的功能是输出当前系统时间所在月的日历,例如当前系统时间是2009年3月10日,则输出2009年3月的日历。

该程序实现的原理为:首先获得该月1号是星期几,然后获得该月的天数,最后使用流程控制实现按照日历的格式进行输出即可。即如果1号是星期一,则打印一个单位的空格,如果1号是星期二,则打印两个单位的空格,依次类推。打印完星期六的日期以后,进行换行。实现该示例的完整代码如下:

import java.util.*;

/**

* 输出当前月的日历

*/

public class DateExample2{

public static void main(String[] args){

//获得当前时间

Calendar c = Calendar.getInstance();

//设置代表的日期为1号

c.set(Calendar.DATE,1);

//获得1号是星期几

int start = c.get(Calendar.DAY_OF_WEEK);

//获得当前月的最大日期数

int maxDay = c.getActualMaximum(Calendar.DATE);

//输出标题

System.out.println("星期日 星期一 星期二 星期三 星期四 星期五 星期六");

//输出开始的空格

for(int i = 1;i < start;i++){

System.out.print(" ");

}

//输出该月中的所有日期

for(int i = 1;i <= maxDay;i++){

//输出日期数字

System.out.print(" " + i);

//输出分隔空格

System.out.print(" ");

if(i < 10){

System.out.print(' ');

}

//判断是否换行

if((start + i - 1) % 7 == 0){

System.out.println();

}

}

//换行

System.out.println();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值