zoukankan      html  css  js  c++  java
  • 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: 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);
    }
    }
    上面程序输出如下:
    EVA duration = 2 hour(s) 13 minute(s)
    Lunar stay = 21 h

  • 相关阅读:
    298. Binary Tree Longest Consecutive Sequence
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    163. Missing Ranges
    336. Palindrome Pairs
    727. Minimum Window Subsequence
    211. Add and Search Word
    年底购物狂欢,移动支付安全不容忽视
    成为程序员前需要做的10件事
    全球首推iOS应用防破解技术!
  • 原文地址:https://www.cnblogs.com/Huanghaihui/p/6134727.html
Copyright © 2011-2022 走看看