知识大全 java技巧之时间计算
Posted 时间
篇首语:笛里谁知壮士心,沙头空照征人骨。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java技巧之时间计算相关的知识,希望对你有一定的参考价值。
import java text DecimalFormat;
import java util Arrays;
/**
* 时间计算工具类
*/
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 = Integer MAX_VALUE ;
/**
* 各常量允许的最小值
*/
private final int[] minFields = Integer MIN_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(this timeSeparator);
String matcher = new StringBuffer()
append( \\\\d+? ) append(pattern)
append( \\\\d+? ) append(pattern)
append( \\\\d+? )
toString();
if(!time matches(matcher))
throw new IllegalArgumentException(time + time format error HH
+ this timeSeparator + mm + this timeSeparator + ss );
String[] times = time split(pattern);
set(DAY );
set(HOUR Integer parseInt(times[ ]));
set(MINUTE Integer parseInt(times[ ]));
set(SECOND Integer parseInt(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 > fields length )
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 < fields length; i++)
int sum = fields[i] + time fields[i] + up;
up = sum / (maxFields[i] + );
result fields[i] = sum % (maxFields[i] + );
return result;
/**
* 将时间进行 减 运算 即减去一个时间
* @param time 需要减的时间
* @return 运算后的时间
*/
public Time subtractTime(Time time)
Time result = new Time();
int down = ; // 退位标志
for (int i = k = fields length ; i < k; i++)
int difference = fields[i] + down;
if (difference >= time fields[i])
difference = time fields[i];
down = ;
else
difference += maxFields[i] + time fields[i];
down = ;
result fields[i] = difference;
result fields[DAY] = fields[DAY] time fields[DAY] + down;
return result;
/**
* 获得时间字段的分隔符
* @return
*/
public String getTimeSeparator()
return timeSeparator;
/**
* 设置时间字段的分隔符(用于字符串格式的时间)
* @param timeSeparator 分隔符字符串
*/
public void setTimeSeparator(String timeSeparator)
this timeSeparator = timeSeparator;
/**
* 正则表达式引用处理方法 源自 JDK @link java util regex Pattern#quote(String)
*/
private String patternQuote(String s)
int slashEIndex = s indexOf( \\\\E );
if (slashEIndex == )
return \\\\Q + s + \\\\E ;
StringBuilder sb = new StringBuilder(s length() * );
sb append( \\\\Q );
slashEIndex = ;
int current = ;
while ((slashEIndex = s indexOf( \\\\E current)) != )
sb append(s substring(current slashEIndex));
current = slashEIndex + ;
sb append( \\\\E\\\\\\\\E\\\\Q );
sb append(s substring(current s length()));
sb append( \\\\E );
return sb toString();
public String toString()
DecimalFormat df = new DecimalFormat( );
return new StringBuffer() append(fields[DAY]) append( )
append(df format(fields[HOUR])) append(timeSeparator)
append(df format(fields[MINUTE])) append(timeSeparator)
append(df format(fields[SECOND]))
toString();
public int hashCode()
final int PRIME = ;
int result = ;
result = PRIME * result + Arrays hashCode(fields);
return result;
public boolean equals(Object obj)
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj getClass())
return false;
final Time other = (Time) obj;
if (!Arrays equals(fields other fields))
return false;
return true;
cha138/Article/program/Java/hx/201311/25946
相关参考
Java计算日期和时间差 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这篇文章将使用两个例子计
今天主要学习的日期操作主要是—–获取日期字段(年月日年中的天数年中的周数等)计算两个时间的间隔日期(年月天)根据开始时间间隔时间计算结束时间 &nbs
Java多线程编程基础之线程和多线程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 随着计算机技
/*@authorshijin*生产者与消费者模型中要保证以下几点*同一时间内只能有一个生产者生产 生产方法加锁sychronized*同一时间内只能
前几天读到google研究员吴军的数学之美系列篇颇有感触而恰好自己前段时间做了个基于统计语言模型的中文切分系统的课程项目于是乎帖出来与大家共同学习 分词技术在搜索引擎信息提取机器翻译等领域的重要
工伤赔偿需要多长时间才能赔偿下来怎样计算按照工伤赔偿的法定程式:1、工伤认定:从单位或个人申请之日算起,劳动部门15日内稽核材料,60日内作出工伤认定,20日内送达,按规定期限的上线计算是95天。2、
Java技巧计算对数 毫无疑问Java可以计算对数然而在API中却有惊人的误差但是如果运用了以下的方法用Java处理数字所遇到的小麻烦就可以轻而易举的解决了 Sun的JSE提供了一个单
Java有一个很好的地方就是java的垃圾收集机制这个机制集成于jvm的对程序员来说是隐藏且不透明的这种情况下如何得到某个对象消耗的内存呢? 曾经看到过有人用以下方法来计算在生成该obj
importjavaawt*; importjavaawtevent*; importjavalang*; importjavaxswing*; publicclassccextendsF
Java中如何计算日期之间的天数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs