1. package base;
  2.  
  3. import java.util.GregorianCalendar;
  4. import java.util.StringTokenizer;
  5. import java.util.TimeZone;
  6.  
  7. /**
  8. * 日期时间封装类 格式:yyyy-MM-dd HH:mm:ss
  9. *
  10. * @author xmj
  11. *
  12. */
  13. public class FDateTime {
  14.  
  15. private long utcTime;//时间毫秒数
  16. public static final TimeZone BASE_TIMEZONE = TimeZone.getTimeZone("GMT+08:00");//时区
  17. public static final int[] LEAP_MONTH_LENGTH = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//闰年每月的天数
  18. public static final int[] MONTH_LENGTH = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//平年每月的天数
  19.  
  20. public FDateTime() {
  21. this(System.currentTimeMillis());
  22. }
  23.  
  24. public FDateTime(long m) {
  25. utcTime = m;
  26. utcTime -= utcTime % 1000L;
  27. }
  28.  
  29. public FDateTime(java.sql.Date date) {
  30. this(date.getTime());
  31. }
  32.  
  33. public FDateTime(java.util.Date date) {
  34. this(date.getTime());
  35. }
  36.  
  37. public FDateTime(String date) {
  38. int[] t = internalParse(date);
  39. utcTime = new GregorianCalendar(t[0], t[1] - 1, t[2], t[3], t[4], t[5]).getTimeInMillis();
  40. }
  41.  
  42. /**
  43. * 解析成yyyy,MM,dd,HH,mm,ss
  44. *
  45. * @param str
  46. * @return
  47. */
  48. static int[] internalParse(String str) {
  49. if (str == null) {
  50. throw new IllegalArgumentException("invalid FDateTime: " + str);
  51. }
  52. str = str.trim();
  53. int index = str.indexOf(' ');
  54. if ((index < 0) || (index > str.length() - 1)) {
  55. throw new IllegalArgumentException("invalid FDateTime: " + str);
  56. }
  57. int[] d = internalParseDate(str);
  58.  
  59. int[] t = internalParseTime(str, index + 1);
  60.  
  61. int[] a = new int[6];
  62.  
  63. System.arraycopy(d, 0, a, 0, d.length);
  64.  
  65. System.arraycopy(t, 0, a, d.length, t.length);
  66.  
  67. return a;
  68. }
  69.  
  70. public String toString() {
  71. GregorianCalendar baseCalendar = basezoneCalendar();
  72. return toDateTimeString(baseCalendar.get(1), baseCalendar.get(2) + 1, baseCalendar.get(5), baseCalendar.get(11),
  73. baseCalendar.get(12), baseCalendar.get(13));
  74. }
  75.  
  76. /**
  77. * 给日历类设置毫秒数
  78. *
  79. * @return
  80. */
  81. private GregorianCalendar basezoneCalendar() {
  82. GregorianCalendar basezoneCalendar = new GregorianCalendar(BASE_TIMEZONE);
  83. basezoneCalendar.setTimeInMillis(utcTime);
  84. return basezoneCalendar;
  85. }
  86.  
  87. /**
  88. * 拼接成yyyy-MM-dd HH:mm:ss
  89. *
  90. * @param year
  91. * @param month
  92. * @param day
  93. * @param hour
  94. * @param minute
  95. * @param second
  96. * @return
  97. */
  98. static String toDateTimeString(int year, int month, int day, int hour, int minute, int second) {
  99. StringBuffer sb = new StringBuffer();
  100. String strYear = String.valueOf(year);
  101. for (int j = strYear.length(); j < 4; j++)
  102. sb.append('0');
  103. sb.append(strYear).append('-');
  104. append(sb, month, '-');
  105. append(sb, day, ' ');
  106. append(sb, hour, ':');
  107. append(sb, minute, ':');
  108. if (second < 10) {
  109. sb.append('0');
  110. }
  111. sb.append(second);
  112. return sb.toString();
  113. }
  114.  
  115. private static void append(StringBuffer sb, int v, char split) {
  116. if (v < 10) {
  117. sb.append('0');
  118. }
  119. sb.append(v).append(split);
  120. }
  121.  
  122. public int getYear() {
  123. return basezoneCalendar().get(1);
  124. }
  125.  
  126. public int getMonth() {
  127. return basezoneCalendar().get(2) + 1;
  128. }
  129.  
  130. public int getDay() {
  131. return basezoneCalendar().get(5);
  132. }
  133.  
  134. public int getHour() {
  135. return basezoneCalendar().get(11);
  136. }
  137.  
  138. public int getMinute() {
  139. return basezoneCalendar().get(12);
  140. }
  141.  
  142. public int getSecond() {
  143. return basezoneCalendar().get(13);
  144. }
  145.  
  146. /**
  147. * 解析成yyyy,MM,dd
  148. *
  149. * @param str
  150. * @return
  151. */
  152. static int[] internalParseDate(String str) {
  153. if (str == null) {
  154. throw new IllegalArgumentException("invalid date: " + str);
  155. }
  156. str = str.trim();
  157. int spaceIndex = str.indexOf(' ');
  158. if (spaceIndex > -1) {
  159. str = str.substring(0, spaceIndex);
  160. }
  161.  
  162. String[] tokens = new String[3];
  163. StringTokenizer st = new StringTokenizer(str, "-/");
  164. if (st.countTokens() != 3) {
  165. throw new IllegalArgumentException("invalid date: " + str);
  166. }
  167.  
  168. int i = 0;
  169. while (st.hasMoreTokens()) {
  170. tokens[(i++)] = st.nextToken();
  171. }
  172. try {
  173. int year = Integer.parseInt(tokens[0]);
  174. int month = Integer.parseInt(tokens[1]);
  175. if ((month < 1) || (month > 12))//限制月份的范围
  176. throw new IllegalArgumentException("invalid date: " + str);
  177. int day = Integer.parseInt(tokens[2]);
  178.  
  179. int daymax = isLeapYear(year) ? LEAP_MONTH_LENGTH[(month - 1)] : MONTH_LENGTH[(month - 1)];//当年当月的最大天数
  180.  
  181. if ((day < 1) || (day > daymax))
  182. throw new IllegalArgumentException("invalid date: " + str);//限制天数的范围
  183. return new int[] { year, month, day };
  184. } catch (Throwable thr) {
  185. if ((thr instanceof IllegalArgumentException)) {
  186. throw ((IllegalArgumentException) thr);
  187. }
  188. throw new IllegalArgumentException("invalid date: " + str);
  189. }
  190. }
  191.  
  192. /**
  193. * 是否闰年
  194. *
  195. * @param year
  196. * @return
  197. */
  198. public static boolean isLeapYear(int year) {
  199. if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) {
  200. return true;
  201. }
  202. return false;
  203. }
  204.  
  205. /**
  206. * 解析成HH,mm,ss
  207. *
  208. * @param time
  209. * @param idx
  210. * @return
  211. */
  212. static int[] internalParseTime(String time, int idx) {
  213. if ((time == null) || (time.length() == 0)) {
  214. throw new IllegalArgumentException("Time can't be empty");
  215. }
  216. if (time.length() != 8 + idx) {
  217. throw new IllegalArgumentException("Time must as format HH:mm:ss, " + time);
  218. }
  219.  
  220. for (int i = idx; i < idx + 8; i++) {
  221. char c = time.charAt(i);
  222. if ((i == idx + 2) || (i == idx + 5)) {
  223. if (c != ':') {
  224. throw new IllegalArgumentException("Time must as format HH:mm:ss, " + time);
  225. }
  226.  
  227. } else if ((c < '0') || (c > '9')) {
  228. throw new IllegalArgumentException("Time must as format HH:mm:ss, " + time);
  229. }
  230. }
  231. int hour = Integer.parseInt(time.substring(idx + 0, idx + 2));
  232. int minute = Integer.parseInt(time.substring(idx + 3, idx + 5));
  233. int second = Integer.parseInt(time.substring(idx + 6, idx + 8));
  234. if ((hour < 0) || (hour >= 24) || (minute < 0) || (minute > 59) || (second < 0) || (second > 59)) {//限制时分秒的范围
  235. throw new IllegalArgumentException("Invalid time, " + time);
  236. }
  237.  
  238. return new int[] { hour, minute, second };
  239. }
  240.  
  241. }

编写测试类

  1. package test;
  2.  
  3. import java.util.Date;
  4. import base.FDateTime;
  5.  
  6. public class TestFDateTime {
  7.  
  8. public static void main(String[] args) {
  9.  
  10. FDateTime fdt=new FDateTime();
  11. System.out.println(fdt);
  12. System.out.println("年:"+fdt.getYear()+"\n月:"+fdt.getMonth()+"\n日:"+fdt.getDay()
  13. +"\n时:"+fdt.getHour()+"\n分:"+fdt.getMinute()+"\n秒:"+fdt.getSecond());
  14.  
  15. System.out.println("===========================xmj-test-Date===========================");
  16. Date d1=new Date();
  17. System.out.println(d1);
  18.  
  19. FDateTime fdt1=new FDateTime(d1);
  20. System.out.println(fdt1);
  21.  
  22. System.out.println("===========================xmj-test-String===========================");
  23. String d2="2021-01-01 13:10:10";
  24. FDateTime fdt2=new FDateTime(d2);
  25. System.out.println(fdt2);
  26.  
  27. String d3="2021-01-01 10:10:60";
  28. FDateTime fdt3=new FDateTime(d3);
  29. System.out.println(fdt3);
  30.  
  31. }
  32.  
  33. }

测试结果

使用Java编写一个日期时间封装类的更多相关文章

  1. java设定一个日期时间,加几分钟(小时或者天)后得到新的日期

    //返回的是字符串型的时间,输入的 //是String day, int x public static String addDateMinut(String day, int x){ SimpleD ...

  2. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  3. Java 8 新日期时间 API

    Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...

  4. java创建Date日期时间笔记

    (1)public Date() 创建的日期类对象的日期时间被设置成创建时刻相对应的日期时间. 例: Java代码 1.Date today=new Date();  //today被设置成创建时刻相 ...

  5. java里的日期时间

    为了更好理解java的日期时间类,在这里我们先介绍一下关于历法.标准时间的一些概念. 历法有很多种,我们大中华上下五千年,自然也有自己的历法,生活中我们通常把自己传统的历法叫做农历,也有人叫它阴历或夏 ...

  6. java android中日期时间 问题总结

    Date 类型: Date date = new Date();   // 代表获取当前系统日期和时间 System.out.println(date); 使用类的方法设置时间和日期:(通过该方法初始 ...

  7. java基础之日期时间工具类

    package zy.test; import java.sql.Timestamp; import java.text.ParseException; import java.text.ParseP ...

  8. Java判断一个日期是否在下周日期区间

    Java实现判断一个日期是否在下周日期区间的方法 /** * 判断输入的日期是否在下周区间 * @return * @author nemowang */ public static boolean ...

  9. 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

    题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 ...

随机推荐

  1. 这个API Hub厉害了,收录了钉钉企业微信等开放Api,还能直接调试

    01 此前时不时会有一些研发小伙伴和我诉苦,说很多企业由于人力财力限制或者需求不强,会直接购买使用第三方的开放API,这样一来, 一则由于开放项目不是量身定制的,寻找自己合适的接口也要搜索调研蛮多时间 ...

  2. 【多线程与高并发原理篇:3_java内存模型】

    1. 概述 Java 内存模型即 Java Memory Model,简称 JMM.从抽象的角度来看,JMM 定义了线程和主内存之间的抽象关系,线程之间的共享变量存储在主内存中,每个线程都有一个私有的 ...

  3. vue-mobile-template 前端开源框架

    开源项目的由来 某天因公司业务需求,想寻找一款H5移动端的模板进行二次开发.但搜遍整个HUB都没法找到合适的空模板进行二次开发,所以心血来潮,于是有了 vue-mobile-template . 介绍 ...

  4. Asp.Net在线预览Word文档的解决方案与思路

    前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈. 这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档. 首先想到的是用第三方 ...

  5. 『现学现忘』Git对象 — 16、Tree对象详解

    目录 1.Tree对象介绍 2.Tree对象说明 (1)初始化一个新的本地版本库 (2)创建一个树对象(重点) (3)创建第二个文件(重点) (4)将第一个树对象加入暂存区,使其成为新的树对 3.总结 ...

  6. JavaWeb之如何把请求数据转成实体类

    JavaWeb之如何把请求数据转成实体类 自己写个工具类加入下面两个静态方法 自定一个注解类DateTimeFormatting 调用方式User user = util.ObjectFromMap( ...

  7. java实现空心金字塔

    前言 最近在学习java,遇到了一个经典打印题目,空心金字塔,初学者记录,根据网上教程,有一句话感觉很好,就是先把麻烦的问题转换成很多的简单问题,最后一一解决就可以了,然后先死后活,先把程序写死,后面 ...

  8. this 去哪?

    this 去哪? 本文写于 2020 年 4 月 26 日 let obj = { foo() { console.log(this) }, } let bar = obj.foo obj.foo() ...

  9. Spring事务源码解读

    一.Spring事务使用 1.通过maven方式引入jar包 <dependency> <groupId>com.alibaba</groupId> <art ...

  10. 【多线程】创建线程方式一:继承Thread类

    创建线程方式一:继承Thread类 代码示例: /** * @Description 继承Thread类,重写run方法,调用start开启线程 * @Author hzx * @Date 2022- ...