Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29951133
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: Java

2008-03-17 11:42:41

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 有关时间操作的实用函数集合
 *
 * @author Quad(百全)
 * @version 1.0
 * @time 2007年09月18日03时37分40秒.359
 * @attention 修改后,运行程序,取得当前时间,修改历史记录
 * @history 1.2007年09月18日03时37分40秒.359 新建
 */

/**
 * 在SimpleDateFormat的构造函数中指定模式,比如:
 *
 * SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.SIMPLIFIED_CHINESE);
 *
 * 也可以获取时间格式的时候使用applyPattern函数临时指定:
 *   SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
 *   sdf.applyPattern("yyyy年MM月dd日_HH时mm分ss秒");
 *   String timeStr = sdf.format(new Date());
 *
 * 什么字符代表什么,这是j2se约定好的,设置模式的时候,我们可以使用约定好的字符加上任何我们想要的字符串。
 *
 * j2se对字符所代表的模式的约定列表如下:
 *
 * Letter Date or Time Component Presentation
 * G  Era designator   Text
 * y  Year     Year
 * M  Month in year   Month
 * w  Week in year   Number
 * W  Week in month   Number
 * D  Day in year    Number
 * d  Day in month   Number
 * F  Day of week in month Number
 * E  Day in week    Text
 * a  Am/pm marker   Text
 * H  Hour in day (0-23)  Number
 * k  Hour in day (1-24  Number
 * K  Hour in am/pm (0-11) Number
 * h  Hour in am/pm (1-12) Number
 * m  Minute in hour   Number
 * s  Second in minute  Number
 * S  Millisecond    Number
 * z  Time zone    General time zone
 * Z  Time zone    RFC 822 time zone
 *
 * */

public class TimeUtils {

 /**
  * 将当前时间格式化成“yyyy年MM月dd日HH时mm分ss秒.SSS”
  *
  * @return 格式化后的当前时间
  */
 public  String getNowTime() {
  return formatTime(null, null);
 }

 /**
  * 得到当前时间的毫秒数
  *
  * @return 当前时间的毫秒数
  */
 public long getCurrentMilliseconds() {
  Calendar cal = Calendar.getInstance();
  return cal.getTimeInMillis();
 }

 /**
  * 将要格式化的时间格式成“yyyy年MM月dd日HH时mm分ss秒.SSS”
  *
  * @param originalTime
  *            需要被格式化的时间
  * @return 已格式化的时间
  */
 public  String formatTime(Date originalTime) {
  return formatTime(originalTime, null);
 }

 /**
  * 将当前时间格式化成指定格式
  *
  * @param format
  *            指定格式
  * @return 格式化后的当前时间
  */
 public  String formatTime(String format) {
  return formatTime(null, format);
 }

 /**
  * 格式化时间
  *
  * @param originalTime
  *            需要被格式化的时间
  * @param format
  *            格式
  * @return desttime 已格式化的时间
  */
 public  String formatTime(Date originalTime, String format) {

  String destTime = null;

  if (originalTime == null) {
   originalTime = Calendar.getInstance().getTime();
  }

  if (format == null) {
   format = "yyyy年MM月dd日HH时mm分ss秒.SSS";
  }

  // 设置时间格式
  SimpleDateFormat dateFormat = new SimpleDateFormat(format);

  try {
   // 格式化时间
   destTime = dateFormat.format(originalTime);
  } catch (Exception ex) {
   System.out.println("格式化时间失败:");
   System.out.println(ex.getMessage());
  }

  return destTime;
 }

 /**
  * 计算两个时间之间相隔天数
  *
  * @param startDay
  *            开始时间
  * @param endDay
  *            结束时间
  * @return 两个时间之间相隔天数
  */
 public int getIntervalDays(Calendar startDay, Calendar endDay) {
  // 确保startday在endday之前
  if (startDay.after(endDay)) {
   Calendar cal = startDay;
   startDay = endDay;
   endDay = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startDay.getTimeInMillis();
  long el = endDay.getTimeInMillis();

  long ei = el - sl;
  // 根据毫秒数计算间隔天数
  return (int) (ei / (1000 * 60 * 60 * 24));
 }

 /**
  * 计算两个时间之间相隔天数
  *
  * @param startDay
  *            开始时间
  * @param endDay
  *            结束时间
  * @return 两个时间之间相隔天数
  */
 public int getIntervalDays(Date startDay, Date endDay) {
  // 确保startday在endday之前
  if (startDay.after(endDay)) {
   Date cal = startDay;
   startDay = endDay;
   endDay = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startDay.getTime();
  long el = endDay.getTime();

  long ei = el - sl;
  // 根据毫秒数计算间隔天数
  return (int) (ei / (1000 * 60 * 60 * 24));
 }

 /**
  * 精确计算两个时间之间相隔天数
  *
  * @param startDay
  *            开始时间
  * @param endDay
  *            结束时间
  * @return 两个时间之间相隔天数
  */
 public int getDaysBetween(Calendar startDay, Calendar endDay) {
  // 确保startday在endday之前
  if (startDay.after(endDay)) {
   java.util.Calendar swap = startDay;
   startDay = endDay;
   endDay = swap;
  }

  int days = endDay.get(Calendar.DAY_OF_YEAR)
    - startDay.get(Calendar.DAY_OF_YEAR);
  int y2 = endDay.get(Calendar.YEAR);

  if (startDay.get(Calendar.YEAR) != y2) {
   startDay = (Calendar) startDay.clone();
   do {
    // 得到当年的实际天数
    days += startDay.getActualMaximum(Calendar.DAY_OF_YEAR);
    startDay.add(Calendar.YEAR, 1);
   } while (startDay.get(Calendar.YEAR) != y2);
  }

  return days;
 }

 /**
  * Calendar转化为Date
  *
  * @param calendar
  *            Calendar对象
  * @return Date对象
  */
 public Date calendarToDate(Calendar calendar) {
  Date date = calendar.getTime();
  return date;
 }

 /**
  * Date转化为Calendar
  *
  * @param date
  *            Date对象
  * @return Calendar对象
  */
 public Calendar dateToCalendar(Date date) {
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);
  return cal;
 }

 /**
  * 计算两个时间之间相隔毫秒数
  *
  * @param startTime
  *            开始时间
  * @param endTime
  *            结束时间
  * @return 相隔毫秒数
  */
 public long getIntervalMilliseconds(Calendar startTime, Calendar endTime) {
  // 确保startday在endday之前
  if (startTime.after(endTime)) {
   Calendar cal = startTime;
   startTime = endTime;
   endTime = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startTime.getTimeInMillis();
  long el = endTime.getTimeInMillis();

  return el - sl;
 }

 /**
  * 计算两个时间之间相隔毫秒数
  *
  * @param startTime
  *            开始时间
  * @param endTime
  *            结束时间
  * @return 相隔毫秒数
  */
 public long getIntervalMilliseconds(Date startTime, Date endTime) {
  // 确保startday在endday之前
  if (startTime.after(endTime)) {
   Date cal = startTime;
   startTime = endTime;
   endTime = cal;
  }
  // 分别得到两个时间的毫秒数
  long sl = startTime.getTime();
  long el = endTime.getTime();

  return el - sl;
 }

 /**
  * 计算某一月份的最大天数
  * @param year 年
  * @param month 月
  * @return 某一月份的最大天数
  */
 public int maxDaysOfMonth(int year, int month) {
  Calendar time = Calendar.getInstance();
  time.clear();
  time.set(Calendar.YEAR, year);
  time.set(Calendar.MONTH, month -1);// 注意,Calendar对象默认一月为0
  int day = time.getActualMaximum(Calendar.DAY_OF_MONTH);// 本月份的天数
  // 注:在使用set方法之前,必须先clear一下,否则很多信息会继承自系统当前时间
  return day;
 }

 /**
  * 主函数,测试本类
  * @param args
  */
 public static void main(String[] args) {
  TimeUtils tu = new TimeUtils();
  System.out.println("现在时间是 : " + tu.getNowTime());
  String time = tu.getNowTime();
  int year = Integer.parseInt(time.substring(0, 4));
  
  int month = Integer.parseInt(time.substring(5, 7));
  System.out.println(tu.maxDaysOfMonth(year, month));
 }

}

阅读(1789) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~