Java的时间处理(续计算Java时间)
Java的时间处理(续<;计算Java时间>)
学习在java中计算基本的时间段
概述
如果你知道怎样在java中使⽤⽇期,那么使⽤时间和它才不多⼀样简单。这篇⽂章告诉你怎样把他们的差别联系起来。Robert Nielsen还告诉你怎样使⽤java来计算抵达航班和制造过程的时间。
作者:Robert Nielsen
翻译:Cocia Lin
这篇⽂章是在我发表过的(译者:已经翻译完成)的基础上的。在这⾥,我列出那篇⽂章⼏个你应该熟悉得关键点。如果这⼏点你不太清楚,我建议你读⼀下<;计算Java时间>,了解⼀下。
1. Java计算时间依靠1970年1⽉1⽇开始的毫秒
数.
2. Date类的构造函数Date()返回代表当前创建的时刻的对象。Date的⽅法getTime()返回⼀个long值在数值上等于1970年1⽉1⽇之前或之后的时刻。
3. DateFormat类⽤来转换Date到String,反之亦然。静态⽅法getDateInstance()返回DateFormat的缺省格式;
getDateInstance(DateFormat.FIELD)返回指定的DateFormat对象格式。Format(Date d)⽅法返回String表⽰⽇期,例如"January 1,2002."反过来,parse(String s)⽅法返回以参数字符串表⽰的Date对象。
4. format()⽅法返回的字符串格式根据不同地区的时间设置⽽有所不同。
5. GregorianCalendear类有两个重要的构造函数:GregorianCalerdar(),返回代表当前创建时间的对象;GregorianCalendar(int year,int month,int date)返回代表任意⽇期的对象。GregorianCalendar类的getTime()⽅法返回⽇期对象。Add(int field,int amount)⽅法通过加或减时间单位,象天数,⽉数或年数来计算⽇期。
GregorianCalendar和 时间
两个GregorianCalendar的构造函数可以⽤来处理时间。前者创建⼀个表⽰⽇期,⼩时和分钟的对象:
GregorianCalendar(int year, int month, int date, int hour, int minute)
第⼆个创建⼀个表⽰⼀个⽇期,⼩时,分钟和秒:
GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
⾸先,我应该提醒⼀下,每⼀个构造函数需要时间信息中的⽇期信息(年,⽉,⽇)。如果你想说2:,你必须指出⽇期。
同样,每⼀个GregorianCalendar构造函数创建⼀个在时间上使⽤毫秒计算的对象。所以,如果你的构造函数只提供年,⽉,⽇参数,那⼩时,分钟,秒和毫秒的值将被置0.
DateFormat和时间
你可以使⽤静态⽅法getDateTimeInstance(int dateStyle,int timeStyle)来建⽴DateFormat对象来显⽰时间和⽇期。这个⽅法表明你想要的⽇期和时间格式。如果你喜欢使⽤缺省格式,可以使⽤getDateTimeInstance()来代替它。
你可以使⽤静态⽅法getTimeInstance(int timeStyle)创建DateFormat对象来显⽰正确的时间。
下⾯的程序⽰范了getDateTimeInstance()和getTimeInstance()怎样⼯作:
import java.util.*;
*;
public class Apollo {
public static void main(String[] args) {
GregorianCalendar liftOffApollo11 = new GregorianCalendar(1969, Calendar.JULY, 16, 9, 32);
Date d = Time();
DateFormat df1 = DateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
DateFormat df2 = TimeInstance(DateFormat.SHORT);
String s1 = df1.format(d);
String s2 = df2.format(d);
java时间日期格式转换System.out.println(s1);
System.out.println(s2);
}
}
在我的电脑上,上⾯的程序显⽰如下:
Jul 16, 1969 9:32:00 AM
9:32 AM
(输出根据你所在得地区有所不同)
计算时间间隔
你可能有时需要计算过去的时间;例如,给你开始和结束时间,你想知道制造流程的持续时间。⼀个出租公司按⼩时或天数出租东西,计算时间对他们也很有⽤。同样的,在⾦融界,经常需要计算重要的⽀付时间。
将问题复杂化,⼈类⾄少是⽤两种⽅法计算时间。你可以说⼀天已经结束当24⼩时过去了,或者⽇历从今天翻到明天。我们将讨论我们想到的这两种情况。
时间段,情况 1:严格时间单位
在这种情况中,只有24⼩时过去,这天才过去,60分钟过去,这个⼩时才过去,60秒过去,这个分钟才过去,以此类推。在这个⽅法
中,23⼩时的时间将被认为是0天。
使⽤这种⽅法计算时间段,你从计算过去的毫秒开始。为了做到这⼀点,⾸先转换每个⽇期为从1970年1⽉1⽇起得毫秒数。你可以从第⼆个毫秒值中减去第⼀个毫秒值。这⾥有⼀个简单的计算:
import java.util.*;
public class ElapsedMillis {
public static void main(String[] args) {
GregorianCalendar gc1 = new GregorianCalendar(1995, 11, 1, 3, 2, 1);
GregorianCalendar gc2 = new GregorianCalendar(1995, 11, 1, 3, 2, 2);
// the above two dates are one second apart
Date d1 = Time();
Date d2 = Time();
long l1 = d1.getTime();
long l2 = d2.getTime();
long difference = l2 - l1;
System.out.println("Elapsed milliseconds: " + difference);
}
}
上⾯的程序打印如下:
Elapsed milliseconds: 1000
这个程序也带来⼀点混淆。GregorianCalendar类的getTime()返回⼀个Date对象,Date类的getTime()⽅
法返回从1970年1⽉1⽇到这个时间的long类型的毫秒数值。虽然他们的⽅法名字相同,返回值却不⼀样!
下⾯的程序⽚断⽤简单的整数除法转换毫秒到秒:
long milliseconds = 1999;
long seconds = 1999 / 1000;
这种⽅法舍去⼩数部分转换毫秒到秒,所以1,999毫秒等于1秒,2,000毫秒等于2秒。
计算更⼤的单位-例如天数,⼩时和分钟-给定⼀个时间数值,可以使⽤下⾯的过程:
1. 计算最⼤的单位,减去这个数值的秒数
2. 计算第⼆⼤单位,减去这个数值的秒数
3. 重复操作直到只剩下秒
例如,如果你的时间的10,000秒,你想知道这个数值相应的是多少⼩时,多少分钟,多少秒,你从最⼤的单位开始:⼩时。10,000除以3600(⼀个⼩时的秒数)得到⼩时数。使⽤整数除法,答案是2⼩时(
整数除法中⼩数舍去)计算剩下的秒数,10,000-(3,600 x 2) = 2,800秒。所以你有2⼩时和2,800秒。
将2,800秒转换成分钟,2,800除以60。使⽤整数除法,答案是46。2,800 - (60 x 46) = 40秒。最后答案是2⼩时,46分,40秒。下⾯的Java程序使⽤上⾯的计算⽅法:
import java.util.*;
public class Elapsed1 {
public void calcHMS(int timeInSeconds) {
int hours, minutes, seconds;
hours = timeInSeconds / 3600;
timeInSeconds = timeInSeconds - (hours * 3600);
minutes = timeInSeconds / 60;
timeInSeconds = timeInSeconds - (minutes * 60);
seconds = timeInSeconds;
System.out.println(hours + " hour(s) " + minutes + " minute(s) " + seconds + " second(s)");
}
public static void main(String[] args) {
Elapsed1 elap = new Elapsed1();
elap.calcHMS(10000);
}
}
输出结果如下:
2 hour(s) 46 minute(s) 40 second(s)
上⾯的程序甚⾄在时间少于⼀个⼩时也可以正确的计算⼩时数。例如,你⽤上⾯的程序计算1,000秒,输出⼊下:
0 hour(s) 16 minute(s) 40 second(s)
举⼀个现实世界的例⼦,下⾯的程序计算11飞到⽉球使⽤得时间:
import java.util.*;
public class LunarLanding {
public long getElapsedSeconds(GregorianCalendar gc1, GregorianCalendar gc2) {
Date d1 = Time();
Date d2 = Time();
long l1 = d1.getTime();
long l2 = d2.getTime();
long difference = Math.abs(l2 - l1);
return difference / 1000;
}
public void calcHM(long timeInSeconds) {
long hours, minutes, seconds;
hours = timeInSeconds / 3600;
timeInSeconds = timeInSeconds - (hours * 3600);
minutes = timeInSeconds / 60;
System.out.println(hours + " hour(s) " + minutes + " minute(s)" );
}
public static void main(String[] args) {
GregorianCalendar lunarLanding = new GregorianCalendar(1969, Calendar.JULY, 20, 16, 17); GregorianCalendar lunarDeparture = new GregorianCalendar(1969, Calendar.JULY, 21, 13, 54); GregorianCalendar startEVA = new GregorianCalendar(1969, Calendar.JULY, 20, 22, 56);
GregorianCalendar endEVA = new GregorianCalendar(1969, Calendar.JULY, 21, 1, 9);
LunarLanding apollo = new LunarLanding();
long eva = ElapsedSeconds(startEVA, endEVA);
System.out.print("EVA duration = ");
apollo.calcHM(eva);
long lunarStay = ElapsedSeconds(lunarLanding, lunarDeparture);
System.out.print("Lunar stay = ");
apollo.calcHM(lunarStay);
}
}
上⾯程序输出如下:
EVA duration = 2 hour(s) 13 minute(s)
Lunar stay = 21 hour(s) 37 minute(s)
⽬前为⽌,我们计算的基础公式是这样的:1分钟=60秒,1⼩时=60分,1天=24⼩时。
"1个⽉=?天,1年=?天"怎么办?
⽉份的天数有28,29,30,31;⼀年可以是365或366天。因此,当你试图计算严格单位的⽉份和年时,问题就产⽣了。例如,如果你使⽤⽉份的平均天数(近似30.4375),并且计算下⾯的时间间隔:
* July 1, 2: to July 31, 10:
* February 1, 2: to February 29, 10:
第⼀个计算结果是1个⽉;第⼆个结果是0个⽉!
所以,在计算严格单位时间的⽉份和年份是要想好。
时间段,情况 2:时间单位变化
时间单位的变化相当的简单:如果你要统计天数,你可以简单的统计⽇期变化次数。例如,如果某事15⽇开始,17⽇结束,经过2天。(⽇期先是便到16,再到17)同样的,⼀个步骤下午3:25开始,4:10
p.m结束,历时1个⼩时,因为⼩时数值变了⼀次(从3到4)。图书馆经常使⽤这种习惯计算时间。例如,如果你从图书馆接⼀本书,我不能占有这本书最少24⼩时,会认为图书馆这样才给你算⼀天。⽽是,我的账号上记录我借书的⽇期。⽇期以变成下⼀天,我就已经结这本书⼀天了,即使总计不⾜24⼩时。
当使⽤单位的变化来计算时间段,通常感觉计算的时间没有多于⼀个时间单位。例如,如果9:我借了⼀本图书馆的书,第⼆天中午还回去,我能算出我借了这本书⼀天了。可是,有⼀种感觉在问:"1天和⼏个⼩时呢?"这本说总计借出15个⼩时,答案是⼀天还差9个⼩时呢?因此,这篇⽂章⾥,我将以⼀个时间单位变化计算时间。
单位变化的时间算法
这是你怎样计算两个⽇期的时间变化:
1. 制作两个⽇期的拷贝。Close()⽅法能制作拷贝。
2. 使⽤⽇期拷贝,将所有的⼩于时间单位变化的部分设置成它的最⼩单位。例如,如果计算天数,那么将⼩时,分钟,秒和毫秒设置成0。这种情况中,使⽤clear()⽅法将时间值设置称他们各⾃的最⼩值。
3. 取出较早的⽇期,将你要计算的单位加1,重复直到两个⽇期相等。你加1的次数就是答案。可以使⽤
before()和after()⽅法,他们返回boolean值,来判断是否⼀个⽇期在另⼀个⽇期之前或之后。
下⾯的类的⽅法⽤来计算天数和⽉数。
import java.util.*;
public class ElapsedTime {
public int getDays(GregorianCalendar g1, GregorianCalendar g2) {
int elapsed = 0;
GregorianCalendar gc1, gc2;
if (g2.after(g1)) {
gc2 = (GregorianCalendar) g2.clone();
gc1 = (GregorianCalendar) g1.clone();
}
else {
gc2 = (GregorianCalendar) g1.clone();
gc1 = (GregorianCalendar) g2.clone();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论