当前位置:  技术问答>java相关

如何得到两个Date型之间相差的天数?

    来源: 互联网  发布时间:2015-11-01

    本文导语:  如题。 | 文字:               背景:               字号:  9pt 10pt 11pt 12pt 13pt 14pt 15pt 16pt      Java的时间处理(续《计算Java时间》)    出处: http://www.javaworld.com/javaworld/j...

如题。

|
文字:               背景:               字号:  9pt 10pt 11pt 12pt 13pt 14pt 15pt 16pt 
 
 

Java的时间处理(续《计算Java时间》) 
  出处: http://www.javaworld.com/javaworld/jw-03-2001/jw-0330-time.html 
  学习在java中计算基本的时间段
  概述
  如果你知道怎样在java中使用日期,那么使用时间和它才不多一样简单。这篇文章告诉你怎样把他们的差别联系起来。Robert Nielsen还告诉你怎样使用java来计算抵达航班和制造过程的时间。
  作者:Robert Nielsen 
  翻译:Cocia Lin
  这篇文章是在我发表过的(译者:已经翻译完成)的基础上的。在这里,我列出那篇文章几个你应该熟悉得关键点。如果这几点你不太清楚,我建议你读一下,了解一下。
  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:30 p.m.,你必须指出日期。
  同样,每一个GregorianCalendar构造函数创建一个在时间上使用毫秒计算的对象。所以,如果你的构造函数只提供年,月,日参数,那小时,分钟,秒和毫秒的值将被置0.
  DateFormat和时间
  你可以使用静态方法getDateTimeInstance(int dateStyle,int timeStyle)来建立DateFormat对象来显示时间和日期。这个方法表明你想要的日期和时间格式。如果你喜欢使用缺省格式,可以使用getDateTimeInstance()来代替它。
  你可以使用静态方法getTimeInstance(int timeStyle)创建DateFormat对象来显示正确的时间。
  下面的程序示范了getDateTimeInstance()和getTimeInstance()怎样工作:
  import java.util.*;
  import java.text.*;
  public class Apollo {
   public static void main(String[] args) {
   GregorianCalendar liftOffApollo11 = new GregorianCalendar(1969, Calendar.JULY, 16, 9, 32);
   Date d = liftOffApollo11.getTime();
   DateFormat df1 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
   DateFormat df2 = DateFormat.getTimeInstance(DateFormat.SHORT);
   String s1 = df1.format(d);
   String s2 = df2.format(d);
   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 = gc1.getTime();
   Date d2 = gc2.getTime();
   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 = gc1.getTime();
   Date d2 = gc2.getTime();
   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 = apollo.getElapsedSeconds(startEVA, endEVA);
   System.out.print("EVA duration = ");
   apollo.calcHM(eva);
   long lunarStay = apollo.getElapsedSeconds(lunarLanding, lunarDeparture);
   System.out.print("Lunar stay = ");
   apollo.calcHM(lunarStay);
   }
  } 


|
int d = (int)((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));

|
calendar好像有这个方法

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在java中我如何得到10-30之间的随机数啊 ,最好能举一例,一定给分儿
  • 万般火急!关于java打印,已经得到printerJob实例,那么怎么通过它得到Pageable实例?
  • 怎样得到当前目录(不是在java程序中得到)
  • File类的getLastModify()得到的是长型整数,如何才能得到一个已知文件日期?
  • DateFormat的用法?比如说现在想要得到21:38,我老是得到9:38
  • jsp中如何获得当前jsp文件所在的目录,用request.getServletPath()得到的路径含有jsp文件名,有没有办法得到目录(不含文件名)?
  • 我用JFileChooser得到了某个文件夹名,但如何得到此文件夹下的所有文件名
  • 苦恼的中文乱码!!!在servlet中用request.getParameter("xingming")得到的姓名域值就变成了乱码"???",更别提下面的转化函数得到的结果了。
  • linux下如何编程得到网卡的硬件描述,如得到某块网卡为“3Com 3c590/3c595....”
  • 如何得到一个终端的终端号/标示?
  • 菜问一则:请问用什么命令可得到系统路径
  • getInitParameter为什么得到null
  • 请问调用那个方法能够得到变量类型的返回值?
  • 怎样得到系统日期?
  • 用java.util.random怎么得到一个指定区间的随机数
  • 如何得到linux机器的时钟频率?
  • 急!如何得到snmp工具的显示数据?
  • 如何得到文本框里的自动换行标志?
  • 如何得到本机所有IP
  • bash脚本程序如何得到自身的执行路径?
  • Linux下得到进程号


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3