java中的时间操作不外乎这四种情况:
1、获取当前时间
2、获取某个时间的某种格式
3、设置时间
4、时间的运算
好,下面就针对这三种情况,一个一个搞定。
一、获取当前时间
有两种方式可以获得,第一种,使用Date类。
j2SE的包里有两个Date类,一个是java.sql.Date,一个是java.util.Date
这里,要使用java.util.Date。获取当前时间的代码如下
Date date = new Date();
date.getTime();
还有一种方式,使用System.currentTimeMillis();
这两种方式获得的结果是一样的,都是得到一个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年一月一号零时零分零秒相差的毫秒数。
当前的时间得到了,但实际的应用中最后往往不是要用这个long型的东西,用户希望得到的往往是一个时间的字符串,比如“2006年6月18号”,或“2006-06-18”,老外可能希望得到的是“06-18-2006”,诸如此类等等。这就是下一个要解决的问题
二、获取某个时间的某种格式
获取时间的格式,需要用到一个专门用于时间格式的类java.text.SimpleDateFormat。
首先,定义一个SimpleDateFormat变量
SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
这个构造函数的定义如下:
SimpleDateFormat(String pattern, Locale locale)
第一个参数pattern,我们后面再解释,这里我们使用一个"",第二个参数,是用来设置时区的,这里用到了java.util.Locale这个类,这个类了面定义了很多静态变量,直接拿过来用就OK,我们把时区设置为Locale.SIMPLIFIED_CHINESE,只看名字,这个静态变量的意义已经很清楚了。
接下来我们使用这个SimpleDateFormat把当前时间格式化为一个如下格式的时间字符串“XXXX年XX月XX日_XX时XX分XX秒”,代码:
sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
String timeStr = sdf.format(new Date());
获取时间格式的函数是format,这个函数的参数是java.util.Date对象,这个没有什么花头。
要说明一下的是这个pattern,所谓的模式。这里,yyyy,MM,dd等,这就是模式。
我们可以在SimpleDateFormat的构造函数中指定模式,比如
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE);
也可以获取时间格式的时候使用applyPattern函数临时指定,上面的例子就是这样。
什么字符代表什么,这是j2se约定好的,设置模式的时候,我们可以使用约定好的字符加上任何我们想要的字符串。
j2se对字符所代表的模式的约定列表如下:
Letter Date or Time Component Presentation
G Era designator Text
y Year Year
M Month in year Month
w Week in year Number
W Week in month Number
D Day in year Number
d Day in month Number
F Day of week in month Number
E Day in week Text
a Am/pm marker Text
H Hour in day (0-23) Number
k Hour in day (1-24) Number
K Hour in am/pm (0-11) Number
h Hour in am/pm (1-12) Number
m Minute in hour Number
s Second in minute Number
S Millisecond Number
z Time zone General time zone
Z Time zone RFC 822 time zone
三、设置时间
现实中的时间是由不得我们这些凡夫俗子的,如来老头来了也许还有点可能,但在程序里我们可以变得神通广大。设置时间最典型的应用就是定时任务,我们设置一个时间,到时执行某项任务。
但这里我们主要不是为了解决这个定时任务的问题,我们是为了搞清楚怎么设置时间。关于定时任务,在后面再讨论怎么做。
所谓的设置时间,其实就是我们把一个我们能看懂的时间的显性的值(数字、字符串等),转化成程序能看得懂的(Date类,long型的毫秒值等)告诉它。
最直接的思路是,new一个Date类,使用它的某个方法,传进我们指定的数字或字符串类型的值,设置它的时间。
那就先来看一下Date这个类,这个类里面有好多方法,什么setYear,setMonth的,看起来真是太好了,传个int值进去就搞定了。
可惜,这些看起来非常good的方法从JDK1.1以后就不用了,只有一个
setTime(long time)方法还勉强可以用,但是看看这个方法的参数吧,TNND,是个long,2006年7月1号的long值是什么?鬼才知道。
所以这个方法不可取,刚才也提到Date类里有很多方法从JDK1.1以后就不用了,其中就有什么setYear,setMonth这样的方法。这些方法不是JDK里面没有了,而是被Calendar类里面的方法给取代了。(为什么取代?这个问题去问开发JDK的那帮人好了)
其实,还是用上面说到的SimpleDateFormat就可以搞定,代码,三行:
SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
Date date = sdf.parse("2006年07月01日_14时00分00秒");
一看就懂了吧,第一行是声明对象的,如果前面已经声明了,这一行也省了,第二行是设置模式(pattern)的,关于这个模式,前面已经解释的很详细了,没有什么好说的。第三行,就是要设置的时间跟模式对应的字符串。第三行就返回了我们要得到的Date类型。(啰嗦了这么半天,才啰嗦出这么三行代码:))
Ok,这个问题搞定,继续下一个。
四、时间的运算
现在我们要开始用Calendar了,简单介绍一下先,JDK的文档里说,Calendar主要是用来对Date对象和Integer对象做转换的(这样看起来上面那个问题我们也可以使用Calendar)。事实上,实际的开发应用中,Calendar往往用来对时间进行操作,比如说设置个时间啊,对时间进行个对比运算什么滴。
举个例子,已知两个Date型时间对象,date1、date2,我们需要计算出这两个时间之间相差几个小时,怎么做。
一种思路:得到这两个时间对象的long值,然后相减,这就得到了他们相差的毫秒值,然后再根据这个毫秒值算出对应的小时。代码如下:
int distance = (int)((date2.getTime() - date1.getTime())/1000/60/60);
简单解释一下:
date2.getTime() - date1.getTime()得到相应的long型时间值并相减,得到相差的毫秒值,再除1000,得到秒,再除60,得到分,再除60,得到小时。呵呵,我真是够啰嗦!从毫秒转化成秒的时候,我在google上搜索了半天才确定一秒等于1000毫秒,真是白痴:)。
按上面的方式,似乎问题已经解决了。但是,结果得到的小时值很大可能是个小数,而且,有可能是个小数位很长的小数,这样就要考虑精确位的问题,上面那行代码就不够用了;还有一个比较关键的问题是,根据我们的习惯,往往可能是希望知道他们相差几小时几分几秒,而不是几点几个小时,也可能我们只想知道他们差几个小时,至于小时之外还差几分几秒,我们不感兴趣,这样,上面那行代码也不够用了。
如果要解决这种方式带来的后续的这两个问题,还要写更多的代码,麻烦死了,我是个懒人,不想费那脑子,我需要找一种更直接,更简单的方式来解决。
终于轮到Calendar出场了,对上面的问题,解决的代码如下:
Calendar ca1 = Calendar.getInstance();
Calendar ca2 = Calendar.getInstance();
ca1.setTime(date1);
ca2.setTime(date2);
int distanceHour = ca2.get(Calendar.HOUR_OF_DAY) - ca1.get(Calendar.HOUR_OF_DAY);
虽然有五行代码,但这五行代码根本都不用费我的脑子考虑,不像前面的,还要考虑转化什么的,而且这五行代码完全可以像前面一样用一行代码搞定。
这样就得到了这两个时间相差的小时的值,我可以保证绝对是个整数,因为这个distanceHour只是这两个时间对象的小时数之差,而不考虑它们的分秒的差,如果想得它们差几分,代码如下
int distanceMin = ca2.get(Calendar.MINUTE) - ca1.get(Calendar.MINUTE);
解释一下上面的代码:
Calendar ca1 = Calendar.getInstance();
得到一个Calendar对象,Calendar不提供公用的构造函数,不能new。这行代码得到的新对象的时间设置为当前时间。
ca1.setTime(date1);
把Calendar对象的时间设置为date1的时间。
ca1.get(Calendar.HOUR_OF_DAY)
获取Calendar对象的小时值,这里得到的是24小时制的。这个get方法参数是int型的,用来指定想要获取的域(field),就是什么年啊月啊周啊小时的东西。参数需要用Calendar类定义的常量,每个常量对应一个域(field),这些常量的含义都很明显(都可以顾名思义出来),用的时候在IDE环境里直接打点选择就可以。
这个get方法用起来很灵活,比如得到一天的int值,我们可以得到这一天一个月里的第几天,也可以得到一周里的第几天,也可以得到一年里的第几天,只要传进对应的参数就OK了。
有一点需要注意的是,按照我们的习惯,周一是一周的第一天,而老外的习惯是周日才是第一天,他们是先做完礼拜才开始这一周的。所以如果今天是周一,我们使用ca1.get(Calendar.DAY_OF_WEEK)时得到的值是2。
前面提到,Canlendar也可以用来设置时间,代码如下
Calendar ca = Calendar.getInstance();
ca.set(Calendar.YEAR, 2006);
ca.set(Calendar.MONTH, 7);
ca.set(Calendar.DAY_OF_MONTH, 1);
ca.set(Calendar.HOUR_OF_DAY, 14);
ca.set(Calendar.MINUTE,0);
ca.set(Calendar.SECOND, 0);
Date date = ca.getTime();
这跟前面第三个问题中的那三行代码的结果基本上是一样的,为什么说基本上?因为毫秒值不一样,ca的毫秒值是当前时间的毫秒值,而我们没有进行设置,所以仍然是当前的毫秒值。用那三行代码,还是用这几行,任君选择。
1、获取当前时间
2、获取某个时间的某种格式
3、设置时间
4、时间的运算
好,下面就针对这三种情况,一个一个搞定。
一、获取当前时间
有两种方式可以获得,第一种,使用Date类。
j2SE的包里有两个Date类,一个是java.sql.Date,一个是java.util.Date
这里,要使用java.util.Date。获取当前时间的代码如下
Date date = new Date();
date.getTime();
还有一种方式,使用System.currentTimeMillis();
这两种方式获得的结果是一样的,都是得到一个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年一月一号零时零分零秒相差的毫秒数。
当前的时间得到了,但实际的应用中最后往往不是要用这个long型的东西,用户希望得到的往往是一个时间的字符串,比如“2006年6月18号”,或“2006-06-18”,老外可能希望得到的是“06-18-2006”,诸如此类等等。这就是下一个要解决的问题
二、获取某个时间的某种格式
获取时间的格式,需要用到一个专门用于时间格式的类java.text.SimpleDateFormat。
首先,定义一个SimpleDateFormat变量
SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
这个构造函数的定义如下:
SimpleDateFormat(String pattern, Locale locale)
第一个参数pattern,我们后面再解释,这里我们使用一个"",第二个参数,是用来设置时区的,这里用到了java.util.Locale这个类,这个类了面定义了很多静态变量,直接拿过来用就OK,我们把时区设置为Locale.SIMPLIFIED_CHINESE,只看名字,这个静态变量的意义已经很清楚了。
接下来我们使用这个SimpleDateFormat把当前时间格式化为一个如下格式的时间字符串“XXXX年XX月XX日_XX时XX分XX秒”,代码:
sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
String timeStr = sdf.format(new Date());
获取时间格式的函数是format,这个函数的参数是java.util.Date对象,这个没有什么花头。
要说明一下的是这个pattern,所谓的模式。这里,yyyy,MM,dd等,这就是模式。
我们可以在SimpleDateFormat的构造函数中指定模式,比如
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE);
也可以获取时间格式的时候使用applyPattern函数临时指定,上面的例子就是这样。
什么字符代表什么,这是j2se约定好的,设置模式的时候,我们可以使用约定好的字符加上任何我们想要的字符串。
j2se对字符所代表的模式的约定列表如下:
Letter Date or Time Component Presentation
G Era designator Text
y Year Year
M Month in year Month
w Week in year Number
W Week in month Number
D Day in year Number
d Day in month Number
F Day of week in month Number
E Day in week Text
a Am/pm marker Text
H Hour in day (0-23) Number
k Hour in day (1-24) Number
K Hour in am/pm (0-11) Number
h Hour in am/pm (1-12) Number
m Minute in hour Number
s Second in minute Number
S Millisecond Number
z Time zone General time zone
Z Time zone RFC 822 time zone
三、设置时间
现实中的时间是由不得我们这些凡夫俗子的,如来老头来了也许还有点可能,但在程序里我们可以变得神通广大。设置时间最典型的应用就是定时任务,我们设置一个时间,到时执行某项任务。
但这里我们主要不是为了解决这个定时任务的问题,我们是为了搞清楚怎么设置时间。关于定时任务,在后面再讨论怎么做。
所谓的设置时间,其实就是我们把一个我们能看懂的时间的显性的值(数字、字符串等),转化成程序能看得懂的(Date类,long型的毫秒值等)告诉它。
最直接的思路是,new一个Date类,使用它的某个方法,传进我们指定的数字或字符串类型的值,设置它的时间。
那就先来看一下Date这个类,这个类里面有好多方法,什么setYear,setMonth的,看起来真是太好了,传个int值进去就搞定了。
可惜,这些看起来非常good的方法从JDK1.1以后就不用了,只有一个
setTime(long time)方法还勉强可以用,但是看看这个方法的参数吧,TNND,是个long,2006年7月1号的long值是什么?鬼才知道。
所以这个方法不可取,刚才也提到Date类里有很多方法从JDK1.1以后就不用了,其中就有什么setYear,setMonth这样的方法。这些方法不是JDK里面没有了,而是被Calendar类里面的方法给取代了。(为什么取代?这个问题去问开发JDK的那帮人好了)
其实,还是用上面说到的SimpleDateFormat就可以搞定,代码,三行:
SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
Date date = sdf.parse("2006年07月01日_14时00分00秒");
一看就懂了吧,第一行是声明对象的,如果前面已经声明了,这一行也省了,第二行是设置模式(pattern)的,关于这个模式,前面已经解释的很详细了,没有什么好说的。第三行,就是要设置的时间跟模式对应的字符串。第三行就返回了我们要得到的Date类型。(啰嗦了这么半天,才啰嗦出这么三行代码:))
Ok,这个问题搞定,继续下一个。
四、时间的运算
现在我们要开始用Calendar了,简单介绍一下先,JDK的文档里说,Calendar主要是用来对Date对象和Integer对象做转换的(这样看起来上面那个问题我们也可以使用Calendar)。事实上,实际的开发应用中,Calendar往往用来对时间进行操作,比如说设置个时间啊,对时间进行个对比运算什么滴。
举个例子,已知两个Date型时间对象,date1、date2,我们需要计算出这两个时间之间相差几个小时,怎么做。
一种思路:得到这两个时间对象的long值,然后相减,这就得到了他们相差的毫秒值,然后再根据这个毫秒值算出对应的小时。代码如下:
int distance = (int)((date2.getTime() - date1.getTime())/1000/60/60);
简单解释一下:
date2.getTime() - date1.getTime()得到相应的long型时间值并相减,得到相差的毫秒值,再除1000,得到秒,再除60,得到分,再除60,得到小时。呵呵,我真是够啰嗦!从毫秒转化成秒的时候,我在google上搜索了半天才确定一秒等于1000毫秒,真是白痴:)。
按上面的方式,似乎问题已经解决了。但是,结果得到的小时值很大可能是个小数,而且,有可能是个小数位很长的小数,这样就要考虑精确位的问题,上面那行代码就不够用了;还有一个比较关键的问题是,根据我们的习惯,往往可能是希望知道他们相差几小时几分几秒,而不是几点几个小时,也可能我们只想知道他们差几个小时,至于小时之外还差几分几秒,我们不感兴趣,这样,上面那行代码也不够用了。
如果要解决这种方式带来的后续的这两个问题,还要写更多的代码,麻烦死了,我是个懒人,不想费那脑子,我需要找一种更直接,更简单的方式来解决。
终于轮到Calendar出场了,对上面的问题,解决的代码如下:
Calendar ca1 = Calendar.getInstance();
Calendar ca2 = Calendar.getInstance();
ca1.setTime(date1);
ca2.setTime(date2);
int distanceHour = ca2.get(Calendar.HOUR_OF_DAY) - ca1.get(Calendar.HOUR_OF_DAY);
虽然有五行代码,但这五行代码根本都不用费我的脑子考虑,不像前面的,还要考虑转化什么的,而且这五行代码完全可以像前面一样用一行代码搞定。
这样就得到了这两个时间相差的小时的值,我可以保证绝对是个整数,因为这个distanceHour只是这两个时间对象的小时数之差,而不考虑它们的分秒的差,如果想得它们差几分,代码如下
int distanceMin = ca2.get(Calendar.MINUTE) - ca1.get(Calendar.MINUTE);
解释一下上面的代码:
Calendar ca1 = Calendar.getInstance();
得到一个Calendar对象,Calendar不提供公用的构造函数,不能new。这行代码得到的新对象的时间设置为当前时间。
ca1.setTime(date1);
把Calendar对象的时间设置为date1的时间。
ca1.get(Calendar.HOUR_OF_DAY)
获取Calendar对象的小时值,这里得到的是24小时制的。这个get方法参数是int型的,用来指定想要获取的域(field),就是什么年啊月啊周啊小时的东西。参数需要用Calendar类定义的常量,每个常量对应一个域(field),这些常量的含义都很明显(都可以顾名思义出来),用的时候在IDE环境里直接打点选择就可以。
这个get方法用起来很灵活,比如得到一天的int值,我们可以得到这一天一个月里的第几天,也可以得到一周里的第几天,也可以得到一年里的第几天,只要传进对应的参数就OK了。
有一点需要注意的是,按照我们的习惯,周一是一周的第一天,而老外的习惯是周日才是第一天,他们是先做完礼拜才开始这一周的。所以如果今天是周一,我们使用ca1.get(Calendar.DAY_OF_WEEK)时得到的值是2。
前面提到,Canlendar也可以用来设置时间,代码如下
Calendar ca = Calendar.getInstance();
ca.set(Calendar.YEAR, 2006);
ca.set(Calendar.MONTH, 7);
ca.set(Calendar.DAY_OF_MONTH, 1);
ca.set(Calendar.HOUR_OF_DAY, 14);
ca.set(Calendar.MINUTE,0);
ca.set(Calendar.SECOND, 0);
Date date = ca.getTime();
这跟前面第三个问题中的那三行代码的结果基本上是一样的,为什么说基本上?因为毫秒值不一样,ca的毫秒值是当前时间的毫秒值,而我们没有进行设置,所以仍然是当前的毫秒值。用那三行代码,还是用这几行,任君选择。
发表评论
-
认识java.security.MessageDigest 类
2007-05-07 19:57 12073Java 加密技术:消息摘要。 一个消息摘要就是一个数据块的 ... -
认识java.lang.Class类
2007-05-07 19:55 1345一. Class类 1. Class对象描述了运行中的clas ... -
认识java.lang.ThreadLocal类
2007-05-07 19:51 2803早在Java 1.2推出之时,Java平台中就引入了一个新的支 ... -
如何把 java 程序编译成 .exe 文件
2007-05-01 02:15 2407常常在网 ... -
开发webservice应用程序
2007-05-01 02:13 1383随着Internet/Intranet的发展,开发模式发生了变 ... -
JSP中include指令和include行为区别
2007-05-01 02:12 1547我们都知道在jsp中include有两种形式,分别是 < ... -
使用javamail发信过程中的一些问题及解决方法
2007-05-01 02:11 10840今天在研究javamail发信 ... -
java实现精确的四舍五入
2007-05-01 02:09 1166java 代码 import java.math ... -
JAVA常用超类
2007-05-01 01:58 1300java 代码 package com.wide ... -
JAVA常用连接数据库关闭数据库等类
2007-05-01 01:56 2841java 代码 package com.wide ... -
JAVA中转换HTML代码
2007-05-01 01:54 1172java 代码 package com.wide ...
相关推荐
在Java编程语言中,时间操作是一项关键功能,用于处理日期、时间和时区相关的任务。Java提供了多种类库来处理时间,这些类库随着时间的推移不断进化,从早期的`java.util.Date`和`java.util.Calendar`到更现代的`...
在Java中,虽然操作系统级别的时间片调度是由底层操作系统实现的,但Java虚拟机(JVM)对此有所配合,通过线程调度来模拟时间片的效果。Java的`Thread`类是进行多线程操作的基础,线程的调度策略包括:抢占式调度、...
JAVA 时间 操作 时间JAVA 时间 操作 时间JAVA 时间 操作 时间JAVA 时间 操作 时间JAVA 时间 操作 时间JAVA 时间 操作 时间JAVA 时间 操作 时间JAVA 时间 操作 时间
在上述提供的代码段中,我们可以看到几个关于Java时间处理的关键知识点。这些方法主要用于获取当前时间,格式化时间字符串,以及将字符串转换为日期对象。 1. **日期对象创建与获取**:`java.util.Date` 类是Java中...
在上述代码中,`getNowDate()`和`getNowDateShort()`方法中虽然没有直接使用`Calendar`,但可以很容易地通过`Calendar.getInstance()`获取一个`Calendar`实例,然后进行进一步的日期时间操作。 Java 8引入了`java....
### Java时间操作详解 在Java中,时间操作是软件开发中的常见需求,涉及到日期和时间的解析、格式化、计算以及存储。Java提供了多种类库来处理这些需求,包括`java.util.Date`、`java.util.Calendar`、`java.time`...
总之,理解和熟练掌握Java的日期时间操作对于开发人员来说至关重要,无论是在处理用户输入、记录日志还是进行复杂的业务逻辑计算中,都可能需要用到这些功能。通过学习和实践,你可以编写出更加高效和易维护的代码。
详细介绍了Java8日期时间相关的api,列举了一些常用的方法,包含java.time、java.time.temporal、java.time.format包下的类和接口操作
在Java编程中,时间监听是一项重要的任务,它允许程序对系统时间的变化进行反应或执行特定操作。这通常通过注册监听器来实现,监听器是一种回调机制,当特定事件发生时,它会被调用。在Java中,我们可以使用`java....
本文将详细介绍如何在Java中实现日期与时间的比较,包括使用`SimpleDateFormat`、`Date`、`Calendar`等类进行时间格式化和比较的方法,并通过示例代码展示具体实现过程。 #### 二、使用`SimpleDateFormat`和`Date`...
java中常用的时间操作;如日期,时间戳,日历,字符串相互转化;时间差等常用日期功能。
在提供的`TimeFormat.java`文件中,可能包含了对这些类的封装和扩展,以提供更加便捷的日期时间操作。例如,可能会有以下功能: 1. 格式化日期时间:提供一个静态方法,接收一个`Date`对象和格式模板字符串,返回...
- `java.util.Calendar`:这是`Date`的增强版,提供了更丰富的日期和时间操作功能,如增加、减少时间单位等。 - `java.time`包:Java 8引入的全新日期和时间API,包括`Year`, `Month`, `DayOfWeek`等枚举类型,...
Java DateUtil.java日期时间操作类源代码,DateUtil类包含了标准的时间和日期格式,以及这些格式在字符串及日期之间转换的方法。比如日期格式转换成时间戳、得到格式化后的系统当前日期、转化日期格式"MM/dd/YY、MM....
在Java编程语言中,操作记录是一项重要的任务,它涉及到对程序执行过程中的各种操作进行跟踪、记录和分析,以便于调试、性能优化或者问题排查。本篇将基于提供的"java-操作记录-对比操作前后不同"的jar文件,探讨...
为了解决这个问题,社区开发了Joda-Time库,它提供了更为强大且易用的日期时间操作功能。"操作日期的java包"即指的是Joda-Time这个第三方库。 Joda-Time是Java领域广泛使用的日期时间处理库,它的设计目标是替代...
这篇博客“转 Java校正电脑时间(java 时间同步)”主要探讨了如何在Java中实现这一功能。 首先,Java中的日期和时间API包括`java.util.Date`、`java.util.Calendar`,以及从Java 8开始引入的更现代的`java.time`包。...
在Java中模拟实现这些操作系统功能,需要深入理解Java的并发和多线程机制,以及Java虚拟机(JVM)的工作原理。开发者需要考虑线程安全、上下文切换开销以及如何在Java环境中高效地实现调度算法。 至于压缩包中的"OS...