1-1-8-13 请问一个关于时间的简单问题——
发信人: ioly (anguls), 信区: Java
标题: Re: ——请问一个关于时间的简单问题——
发信站: BBS 水木清华站 (Tue Oct 15 18:08:14 2002), 站内信件
但愿这个类能终结这类问题:)
暴力时间分析
/**
* SimpleTime是基于Calendar的一个简单的日期util.
* 主要用途在于Calendar, Date和String间的转换.
* 域只有年, 月, 日, 时, 分, 秒
* 方法SimpleTime.create(String src, String format)可以识别所有形如
* "yyyy-mm-dd","yy-mm-dd","hh:mi", "hh24:mi:ss", "yyyy/mm/dd hh24_mi_ss", "
mi_ss_hh dd_yy_mm"等
* 格式的format, 要求是年月日时分秒之间以任意多个非数字字符或者空格分隔
* 程序将根据所给的format分析src, 返回一个SimpleTime类, 如果非法则返回null.
* 两位年份表示法中00-09代表2002-2009, 10-99代表1910-1999
* 方法SimpleTime.toString(String format)返回任意指定格式的日期String.
* 需要注意的是jdk中1月为int 0, 12月为int 11
*/
import java.util.Calendar;
import java.util.Date;
public class SimpleTime{
private int year = 0;
private int month = 0;
private int day = 0;
private int hour = 0;
private int minute = 0;
private int second = 0;
//数据缓冲
private Calendar calendar = Calendar.getInstance();
private Date date = new Date();
/**
* default constructor, using current time
* @see setTime(Date c), setTime(Calendar c), SimpleTime.create(String src,
String format)
*/
public SimpleTime(){
this.setTime(calendar);
}
/**
* constructor
*/
public SimpleTime(int year, int month, int day, int hour, int minute, int s
econd){
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
this.second = second;
}
/**
* constructor
*/
public SimpleTime(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
/**
* constructor
* @param d
*/
public SimpleTime(SimpleTime st){
this.year = st.getYear();
this.month = st.getMonth();
this.day = st.getDay();
this.hour = st.getHour();
this.minute = st.getMinute();
this.second = st.getSecond();
}
/**
* constructor
*/
public SimpleTime(Date d){
this.setTime(d);
}
/**
* constructor
*/
public SimpleTime(Calendar c){
this.setTime(c);
}
/**
* get a clone
* @return new SimpleTime object
* @see SimpleTime(SimpleTime st)
*/
public SimpleTime getClone(){
return new SimpleTime(this);
}
/**
* 构造一个SimpleTime对象
* @param src 指明时间
* @param format 指明时间格式, 年月日时分秒之间必须有任意非数字分隔字符
* @return SimpleTime if successfully parsed and null if failed
*/
public static SimpleTime create(String src, String format){
SimpleTime st = new SimpleTime();
try{
char[] a = src.trim().toLowerCase().toCharArray();
char[] b = format.trim().toLowerCase().toCharArray();
int i0 = 0, i1 = 0, j0 = 0;
while(true){
i0 = i1;
while(i0 < a.length && !Character.isDigit(a)){
i0++;j0++;
}
if (i0 == a.length){
break;
}
i1 = i0 + 1;
while(i1 < a.length && Character.isDigit(a)){
i1++;
}
int val = Integer.parseInt(new String(a, i0, i1 - i0));
if (b == 'y'){
if (i1 - i0 == 4){//yyyy
j0 = j0 + 4;
}else{//yy
j0 = j0 + 2;
if (val < 10){
val += 2000;
}else val += 1900;
}
st.year = val;
}else if (b == 'm'){
if (b == 'm'){//mm
st.month = val;
}else{//mi
st.minute = val;
}
j0 = j0 + 2;
}else if (b == 'd'){//dd
st.day = val;
j0 = j0 + 2;
}else if (b == 'h'){
if ((j0 + 3 < b.length) && b == '2' && b
== '4'){//hh24
j0 = j0 + 4;
}else{//hh
j0 = j0 + 2;
}
st.hour = val;
}else if (b == 's'){//ss
st.second = val;
j0 = j0 + 2;
}
}
return st;
}catch(Exception e){
return null;
}
}
/**
* getter
*/
public int getYear(){
return year;
}
/**
* setter
*/
public void setYear(int year){
this.year = year;
}
/**
* getter
*/
public int getMonth(){
return month;
}
/**
* setter
*/
public void setMonth(int month){
this.month = month;
}
/**
* getter
*/
public int getDay(){
return day;
}
/**
* setter
*/
public void setDay(int day){
this.day = day;
}
/**
* getter
*/
public int getMinute(){
return minute;
}
/**
* setter
*/
public void setMinute(int minute){
this.minute = minute;
}
/**
* getter
*/
public int getHour(){
return hour;
}
/**
* setter
*/
public void setHour(int hour){
this.hour = hour;
}
/**
* getter
*/
public int getSecond(){
return second;
}
/**
* setter
*/
public void setSecond(int second){
this.second = second;
}
/**
* set the SimpleTime's time to the given Date object
* jdk中1月为int 0, 12月为int 11
* @param d a Date object
* @see setTime(Calendar c)
*/
public void setTime(Date d){
calendar.setTime(d);
this.setTime(calendar);
}
/**
* set the SimpleTime's time to the given time
* from January 1, 1970, 00:00:00 GMT
* @param time
*/
public void setTime(long time){
date.setTime(time);
this.setTime(date);
}
/**
* set the SimpleTime's time to the given Calendar object<br>
* jdk中1月为int 0, 12月为int 11
* @param c a Calendar object
* @see Calendar.getInstance(), setTime(Date d)
*/
public void setTime(Calendar c){
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
day = c.get(Calendar.DAY_OF_MONTH);
hour = c.get(Calendar.HOUR_OF_DAY);
minute = c.get(Calendar.MINUTE);
second = c.get(Calendar.SECOND);
}
/**
* jdk中1月为int 0, 12月为int 11<br>
* Careful, this method won't test the validation of this SimpleTime<br>and
you can always get a Date object
* @return a Date object using this SimpleTime's info
*/
public Date toDate(){
calendar.set(year, month - 1, day, hour, minute, second);
return calendar.getTime();
}
/**
* jdk中1月为int 0, 12月为int 11<br>
* Careful, this method won't test the validation of this SimpleTime<br>and
you can always get a Calendar object
* @return a Calendar object using this SimpleTime's info
*/
public Calendar toCalendar(){
Calendar c = Calendar.getInstance();
c.set(year, month - 1, day, hour, minute, second);
return c;
}
/**
* calculator
* @param field "year" or "month" or "day" or "hour" or "minute" or "second
"
* @param amount positive(+) for adding and negative(-) for subtraction
*/
public void add(String field, int amount){
calendar.set(year, month - 1, day, hour, minute, second);
if ("year".equalsIgnoreCase(field)){
calendar.add(Calendar.YEAR, amount);
}else if ("month".equalsIgnoreCase(field)){
calendar.add(Calendar.MONTH, amount);
}else if ("day".equalsIgnoreCase(field)){
calendar.add(Calendar.DAY_OF_MONTH, amount);
}else if ("hour".equalsIgnoreCase(field)){
calendar.add(Calendar.HOUR, amount);
}else if ("minute".equalsIgnoreCase(field)){
calendar.add(Calendar.MINUTE, amount);
}else if ("second".equalsIgnoreCase(field)){
calendar.add(Calendar.SECOND, amount);
}
this.setTime(calendar);
}
/**
* comparator
* @param s SimpleTime object
* @return true if this SimpleTime's time is after the given SimpleTime s a
nd false if not
*/
public boolean after(SimpleTime s){
int yy = s.getYear();
int mm = s.getMonth();
int dd = s.getDay();
int hh = s.getHour();
int mi = s.getMinute();
int ss = s.getSecond();
return (year > yy
|| year == yy && month > mm
|| year == yy && month == mm && day > dd
|| year == yy && month == mm && day == dd && hour > hh
|| year == yy && month == mm && day == dd && hour == hh && minute > mi
|| year == yy && month == mm && day == dd && hour == hh && minute == mi
&& second > ss
);
}
/**
* comparator
* @param s SimpleTime object
* @return true if this SimpleTime's time equals the given SimpleTime s and
false if not
*/
public boolean equals(Object o){
if (o == null || !(o instanceof SimpleTime)){
return false;
}
SimpleTime s = (SimpleTime)o;
return (year == s.getYear()
&& month == s.getMonth()
&& day == s.getDay()
&& hour == s.getHour()
&& minute == s.getMinute()
&& second == s.getSecond()
);
}
/**
* comparator
* @param s SimpleTime object
* @return true if this SimpleTime's time is before the given SimpleTime s
and false if not
*/
public boolean before(SimpleTime s){
return !(after(s) || equals(s));
}
/**
* test whether current SimpleTime's year is a peak year<br>
* a peak year has 366 days
* @return true if this SimpleTime's year is a peak year and false if not
*/
public boolean isPeakYear(){
return (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0));
}
/**
* test whether this SimpleTime is a valid time
*/
public boolean isValid(){
if (month <= 0
|| month > 12
|| day <= 0
|| day > 31
|| hour < 0
|| hour > 23
|| minute < 0
|| minute > 59
|| second < 0
|| second > 59)
return false;
switch (month){
case 2:{
if (isPeakYear()){
if (day > 29) return false;
}else if (day > 28) return false;
break;
}
case 4:
case 6:
case 9:
case 11:if (day > 30) return false;break;
}
return true;
}
/**
* try to create a SimpleTime using given src and format and test whether i
t is valid
* @param src the time String
* @param format the format String
* @return true if a SimpleTime object created and this object is valid
* and false if parse failed
* @see SimpleTime.create(String src, String format)
*/
public static boolean isValid(String src, String format){
boolean result = false;
SimpleTime s = SimpleTime.create(src, format);
if (s != null){
result = s.isValid();
}
return result;
}
/**
* get a "yyyy-mm-dd" String
* @return a String presents current SimpleTime
*/
public String toYMD(){
return year + "-"
+ (month < 10?"0" + month:String.valueOf(month)) + "-"
+ (day < 10?"0" + day:String.valueOf(day));
}
/**
* get a String presents current SimpleTime
* @param formatString a String points out the format<br>
* formatString can contain any of
* "yyyy", "yy", "mm", "dd", "hh24", "hh", "mi", "ss"
* for any times
* @return a String presents current SimpleTime
*/
public String toString(String formatString){
String format = formatString.trim().toLowerCase();
String[] accept = {"yyyy", "yy", "mm", "dd", "hh24", "hh", "mi", "ss"};
String[] data = {
String.valueOf(year), //yyyy
year > 99?String.valueOf(year).substring(2):String.valueOf(year)
,//yy
month > 9?String.valueOf(month):"0" + month, //mm
day > 9?String.valueOf(day):"0" + day, //dd
hour > 9?String.valueOf(hour):"0" + hour, //hh24
(hour % 24) > 9?String.valueOf((hour % 24)):"0" + (hour % 24),//hh
minute > 9?String.valueOf(minute):"0" + minute, //mi
second > 9?String.valueOf(second):"0" + second //ss
};
for(int i = 0, len = accept.length;i < len;i++){
format = SimpleTime.replace(format, accept, data);
}
return format;
}
/**
* String replace like regex
* @param String strstring will replace
* @param String oldstrwill be replaced string
* @param String newstrreplace string
* @return String ret the string after replace
*
* @author Tony (tanxin@dichain.com)2001-04-28
*/
public static String replace(String str,String oldstr,String newstr){
int lastpos = -1;
String ret = "";
if (str == null || oldstr == null || newstr == null){
return str;
}
lastpos = str.indexOf(oldstr);
if (lastpos == -1){
return str;
}
while (lastpos >= 0){
ret = ret + str.substring(0,lastpos);
ret = ret + newstr;
str = str.substring(lastpos + oldstr.length());
lastpos = str.indexOf(oldstr);
}
if (str!=null && !str.trim().equals("")) ret = ret + str;
return ret;
}
/**
* get the day of the week, int 1 for sunday, 2 for Mon....
*
*
*/
public int getDayOfWeek(){
calendar.set(year, month - 1, day, hour, minute, second);
return calendar.get(Calendar.DAY_OF_WEEK);
}
/**
* for debug only
*/
public void show(){
System.out.println("\r\nyear==" + year
+ " month==" + month
+ " day==" + day
+ " hour==" + hour
+ " minute==" + minute
+ " second==" + second
+ " valid?==" + isValid()
+ " yyyy-mm-dd==" + toYMD()
+ " yyyy-mm-dd hh24:mi:ss==" + toString(" yyyy-mm-dd hh24:mi:ss")
+ " day_of_week==" + getDayOfWeek());
}
/**
* for test only
* @param args arguments
*/
public static void main(String[] args){
SimpleTime.create("8:00", "hh:mi").show();
SimpleTime st = SimpleTime.create("9:00", "hh:mi");
st.show();
st.add("hour", 1);
st.show();
st.add("month", 3);
st.show();
SimpleTime.create("2-3-4 2:3:4", "yyyy-mm-dd hh24:mi:ss").show();
}
}
【 在 qyjohn (Sweet Potato -- 太阳最红,咪咪最亲) 的大作中提到: 】
: Press x on the article list,
: x -> 3 -> 4 -> 8 -> 1
页:
[1]