熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java技巧之時間計算

2013-11-23 18:53:37  來源: Java核心技術 

  import javatextDecimalFormat;

  import javautilArrays;

  /**

  * 時間計算工具類

  */

  public class Time {

  /**

  * 時間字段常量表示

  */

  public final static int SECOND = ;

  /**

  * 時間字段常量表示

  */

  public final static int MINUTE = ;

  /**

  * 時間字段常量表示

  */

  public final static int HOUR = ;

  /**

  * 時間字段常量表示

  */

  public final static int DAY = ;

  /**

  * 各常量允許的最大值

  */

  private final int[] maxFields = { IntegerMAX_VALUE };

  /**

  * 各常量允許的最小值

  */

  private final int[] minFields = { IntegerMIN_VALUE };

  /**

  * 默認的字符串格式時間分隔符

  */

  private String timeSeparator = :;

  /**

  * 時間數據容器

  */

  private int[] fields = new int[];

  /**

  * 無參構造將各字段置為

  */

  public Time() {

  this( );

  }

  /**

  * 使用時分構造一個時間

  * @param hour      小時

  * @param minute    分鐘

  */

  public Time(int hour int minute) {

  this( hour minute );

  }

  /**

  * 使用時秒構造一個時間

  * @param hour      小時

  * @param minute    分鐘

  * @param second    秒

  */

  public Time(int hour int minute int second) {

  this( hour minute second);

  }

  /**

  * 使用一個字符串構造時間<br/>

  * Time time = new Time(::);

  * @param time      字符串格式的時間默認采用:作為分隔符

  */

  public Time(String time) {

  this(time null);

  }

  /**

  * 使用天秒構造時間進行全字符的構造

  * @param day       天

  * @param hour      時

  * @param minute    分

  * @param second    秒

  */

  public Time(int day int hour int minute int second) {

  set(DAY day);

  set(HOUR hour);

  set(MINUTE minute);

  set(SECOND second);

  }

  /**

  * 使用一個字符串構造時間指定分隔符<br/>

  * Time time = new Time( );

  * @param time      字符串格式的時間

  */

  public Time(String time String timeSeparator) {

  if(timeSeparator != null) {

  setTimeSeparator(timeSeparator);

  }

  String pattern = patternQuote(thistimeSeparator);

  String matcher = new StringBuffer()

  append(\\d+?)append(pattern)

  append(\\d+?)append(pattern)

  append(\\d+?)

  toString();

  if(!timematches(matcher)) {

  throw new IllegalArgumentException(time + time format error HH

  + thistimeSeparator + mm + thistimeSeparator + ss);

  }

  String[] times = timesplit(pattern);

  set(DAY );

  set(HOUR IntegerparseInt(times[]));

  set(MINUTE IntegerparseInt(times[]));

  set(SECOND IntegerparseInt(times[]));

  }

  /**

  * 設置時間字段的值

  * @param field     時間字段常量

  * @param value     時間字段的值

  */

  public void set(int field int value) {

  if(value < minFields[field]) {

  throw new IllegalArgumentException(value +

   time value must be positive);

  }

  fields[field] = value % (maxFields[field] + );

  // 進行進位計算

  int carry = value / (maxFields[field] + );

  if(carry > ) {

  int upFieldValue = get(field + );

  set(field + upFieldValue + carry);

  }

  }

  /**

  * 獲得時間字段的值

  * @param field     時間字段常量

  * @return          該時間字段的值

  */

  public int get(int field) {

  if(field < || field > fieldslength ) {

  throw new IllegalArgumentException(field + field value is error);

  }

  return fields[field];

  }

  /**

  * 將時間進行運算即加上一個時間

  * @param time      需要加的時間

  * @return          運算後的時間

  */

  public Time addTime(Time time) {

  Time result = new Time();

  int up = ;     // 進位標志

  for (int i = ; i < fieldslength; i++) {

  int sum = fields[i] + timefields[i] + up;

  up = sum / (maxFields[i] + );

  resultfields[i] = sum % (maxFields[i] + );

  }

  return result;

  }

  /**

  * 將時間進行運算即減去一個時間

  * @param time      需要減的時間

  * @return          運算後的時間

  */

  public Time subtractTime(Time time) {

  Time result = new Time();

  int down = ;       // 退位標志

  for (int i = k = fieldslength ; i < k; i++) {

  int difference = fields[i] + down;

  if (difference >= timefields[i]) {

  difference = timefields[i];

  down = ;

  } else {

  difference += maxFields[i] + timefields[i];

  down = ;

  }

  resultfields[i] = difference;

  }

  resultfields[DAY] = fields[DAY] timefields[DAY] + down;

  return result;

  }

  /**

  * 獲得時間字段的分隔符

  * @return

  */

  public String getTimeSeparator() {

  return timeSeparator;

  }

  /**

  * 設置時間字段的分隔符(用於字符串格式的時間)

  * @param timeSeparator     分隔符字符串

  */

  public void setTimeSeparator(String timeSeparator) {

  thistimeSeparator = timeSeparator;

  }

  /**

  * 正則表達式引用處理方法源自 JDK @link javautilregexPattern#quote(String)

  */

  private String patternQuote(String s) {

  int slashEIndex = sindexOf(\\E);

  if (slashEIndex == )

  return \\Q + s + \\E;

  StringBuilder sb = new StringBuilder(slength() * );

  sbappend(\\Q);

  slashEIndex = ;

  int current = ;

  while ((slashEIndex = sindexOf(\\E current)) != ) {

  sbappend(ssubstring(current slashEIndex));

  current = slashEIndex + ;

  sbappend(\\E\\\\E\\Q);

  }

  sbappend(ssubstring(current slength()));

  sbappend(\\E);

  return sbtoString();

  }

  public String toString() {

  DecimalFormat df = new DecimalFormat();

  return new StringBuffer()append(fields[DAY])append( )

  append(dfformat(fields[HOUR]))append(timeSeparator)

  append(dfformat(fields[MINUTE]))append(timeSeparator)

  append(dfformat(fields[SECOND]))

  toString();

  }

  public int hashCode() {

  final int PRIME = ;

  int result = ;

  result = PRIME * result + ArrayshashCode(fields);

  return result;

  }

  public boolean equals(Object obj) {

  if (this == obj)

  return true;

  if (obj == null)

  return false;

  if (getClass() != objgetClass())

  return false;

  final Time other = (Time) obj;

  if (!Arraysequals(fields otherfields)) {

  return false;

  }

  return true;

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25946.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.