package base;

import java.util.GregorianCalendar;
import java.util.StringTokenizer;
import java.util.TimeZone; /**
* 日期时间封装类 格式:yyyy-MM-dd HH:mm:ss
*
* @author xmj
*
*/
public class FDateTime { private long utcTime;//时间毫秒数
public static final TimeZone BASE_TIMEZONE = TimeZone.getTimeZone("GMT+08:00");//时区
public static final int[] LEAP_MONTH_LENGTH = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//闰年每月的天数
public static final int[] MONTH_LENGTH = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//平年每月的天数 public FDateTime() {
this(System.currentTimeMillis());
} public FDateTime(long m) {
utcTime = m;
utcTime -= utcTime % 1000L;
} public FDateTime(java.sql.Date date) {
this(date.getTime());
} public FDateTime(java.util.Date date) {
this(date.getTime());
} public FDateTime(String date) {
int[] t = internalParse(date);
utcTime = new GregorianCalendar(t[0], t[1] - 1, t[2], t[3], t[4], t[5]).getTimeInMillis();
} /**
* 解析成yyyy,MM,dd,HH,mm,ss
*
* @param str
* @return
*/
static int[] internalParse(String str) {
if (str == null) {
throw new IllegalArgumentException("invalid FDateTime: " + str);
}
str = str.trim();
int index = str.indexOf(' ');
if ((index < 0) || (index > str.length() - 1)) {
throw new IllegalArgumentException("invalid FDateTime: " + str);
}
int[] d = internalParseDate(str); int[] t = internalParseTime(str, index + 1); int[] a = new int[6]; System.arraycopy(d, 0, a, 0, d.length); System.arraycopy(t, 0, a, d.length, t.length); return a;
} public String toString() {
GregorianCalendar baseCalendar = basezoneCalendar();
return toDateTimeString(baseCalendar.get(1), baseCalendar.get(2) + 1, baseCalendar.get(5), baseCalendar.get(11),
baseCalendar.get(12), baseCalendar.get(13));
} /**
* 给日历类设置毫秒数
*
* @return
*/
private GregorianCalendar basezoneCalendar() {
GregorianCalendar basezoneCalendar = new GregorianCalendar(BASE_TIMEZONE);
basezoneCalendar.setTimeInMillis(utcTime);
return basezoneCalendar;
} /**
* 拼接成yyyy-MM-dd HH:mm:ss
*
* @param year
* @param month
* @param day
* @param hour
* @param minute
* @param second
* @return
*/
static String toDateTimeString(int year, int month, int day, int hour, int minute, int second) {
StringBuffer sb = new StringBuffer();
String strYear = String.valueOf(year);
for (int j = strYear.length(); j < 4; j++)
sb.append('0');
sb.append(strYear).append('-');
append(sb, month, '-');
append(sb, day, ' ');
append(sb, hour, ':');
append(sb, minute, ':');
if (second < 10) {
sb.append('0');
}
sb.append(second);
return sb.toString();
} private static void append(StringBuffer sb, int v, char split) {
if (v < 10) {
sb.append('0');
}
sb.append(v).append(split);
} public int getYear() {
return basezoneCalendar().get(1);
} public int getMonth() {
return basezoneCalendar().get(2) + 1;
} public int getDay() {
return basezoneCalendar().get(5);
} public int getHour() {
return basezoneCalendar().get(11);
} public int getMinute() {
return basezoneCalendar().get(12);
} public int getSecond() {
return basezoneCalendar().get(13);
} /**
* 解析成yyyy,MM,dd
*
* @param str
* @return
*/
static int[] internalParseDate(String str) {
if (str == null) {
throw new IllegalArgumentException("invalid date: " + str);
}
str = str.trim();
int spaceIndex = str.indexOf(' ');
if (spaceIndex > -1) {
str = str.substring(0, spaceIndex);
} String[] tokens = new String[3];
StringTokenizer st = new StringTokenizer(str, "-/");
if (st.countTokens() != 3) {
throw new IllegalArgumentException("invalid date: " + str);
} int i = 0;
while (st.hasMoreTokens()) {
tokens[(i++)] = st.nextToken();
}
try {
int year = Integer.parseInt(tokens[0]);
int month = Integer.parseInt(tokens[1]);
if ((month < 1) || (month > 12))//限制月份的范围
throw new IllegalArgumentException("invalid date: " + str);
int day = Integer.parseInt(tokens[2]); int daymax = isLeapYear(year) ? LEAP_MONTH_LENGTH[(month - 1)] : MONTH_LENGTH[(month - 1)];//当年当月的最大天数 if ((day < 1) || (day > daymax))
throw new IllegalArgumentException("invalid date: " + str);//限制天数的范围
return new int[] { year, month, day };
} catch (Throwable thr) {
if ((thr instanceof IllegalArgumentException)) {
throw ((IllegalArgumentException) thr);
}
throw new IllegalArgumentException("invalid date: " + str);
}
} /**
* 是否闰年
*
* @param year
* @return
*/
public static boolean isLeapYear(int year) {
if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) {
return true;
}
return false;
} /**
* 解析成HH,mm,ss
*
* @param time
* @param idx
* @return
*/
static int[] internalParseTime(String time, int idx) {
if ((time == null) || (time.length() == 0)) {
throw new IllegalArgumentException("Time can't be empty");
}
if (time.length() != 8 + idx) {
throw new IllegalArgumentException("Time must as format HH:mm:ss, " + time);
} for (int i = idx; i < idx + 8; i++) {
char c = time.charAt(i);
if ((i == idx + 2) || (i == idx + 5)) {
if (c != ':') {
throw new IllegalArgumentException("Time must as format HH:mm:ss, " + time);
} } else if ((c < '0') || (c > '9')) {
throw new IllegalArgumentException("Time must as format HH:mm:ss, " + time);
}
}
int hour = Integer.parseInt(time.substring(idx + 0, idx + 2));
int minute = Integer.parseInt(time.substring(idx + 3, idx + 5));
int second = Integer.parseInt(time.substring(idx + 6, idx + 8));
if ((hour < 0) || (hour >= 24) || (minute < 0) || (minute > 59) || (second < 0) || (second > 59)) {//限制时分秒的范围
throw new IllegalArgumentException("Invalid time, " + time);
} return new int[] { hour, minute, second };
} }

编写测试类

package test;

import java.util.Date;
import base.FDateTime; public class TestFDateTime { public static void main(String[] args) { FDateTime fdt=new FDateTime();
System.out.println(fdt);
System.out.println("年:"+fdt.getYear()+"\n月:"+fdt.getMonth()+"\n日:"+fdt.getDay()
+"\n时:"+fdt.getHour()+"\n分:"+fdt.getMinute()+"\n秒:"+fdt.getSecond()); System.out.println("===========================xmj-test-Date===========================");
Date d1=new Date();
System.out.println(d1); FDateTime fdt1=new FDateTime(d1);
System.out.println(fdt1); System.out.println("===========================xmj-test-String===========================");
String d2="2021-01-01 13:10:10";
FDateTime fdt2=new FDateTime(d2);
System.out.println(fdt2); String d3="2021-01-01 10:10:60";
FDateTime fdt3=new FDateTime(d3);
System.out.println(fdt3); } }

测试结果

使用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. A. And Matching

    分析题目:这道题的题目是说给定一个2的幂次n,然后要求我们从0~n-1这n个数中不重复的挑选两个进行配对,要求配对后的每一对按位与之和为k: 而且k的话还是从0~n-1都有的: 既然题目都这样说了,那 ...

  2. 【课程汇总】OpenHarmony全场景Demo数字管家系列课(附链接)

    小孩放学了,做作业的时间到,窗帘.护眼灯自动打开,关掉电视和扫地机,给小孩一个安静舒适的学习环境:碰到学习难题,可以随时请求你的远程指导:晚上回家休息了,选择舒适的氛围灯,伴随着睡眠音乐进入梦乡:出门 ...

  3. signed integer overflow整数溢出

    整数越界情况 1. 数组下标越界, 大于N或者小于0 2. 数字过大,可以选择取个模,或者换long long, double  我笑了 还有一个暂时没有好的解决方法的:string s:cin/输入 ...

  4. WebSocket 协议详解

    一.WebSocket 协议背景 早期,在网站上推送消息给用户,只能通过轮询的方式或 Comet 技术.轮询就是浏览器每隔几秒钟向服务端发送 HTTP 请求,然后服务端返回消息给客户端. 轮询技术一般 ...

  5. Bugku练习题---MISC---FileStoragedat

    Bugku练习题---MISC---FileStoragedat flag:bugku{WeChatwithSteg0} 解题步骤: 1.观察题目,下载附件 2.下载后发现是一个后缀名为.dat的文件 ...

  6. 【Java分享客栈】一文搞定CompletableFuture并行处理,成倍缩短查询时间。

    前言   工作中你可能会遇到很多这样的场景,一个接口,要从其他几个service调用查询方法,分别获取到需要的值之后再封装数据返回.   还可能在微服务中遇到类似的情况,某个服务的接口,要使用好几次f ...

  7. 排序算法详解(java代码实现)

    ​ 排序算法大致分为内部排序和外部排序两种 内部排序:待排序的记录全部放到内存中进行排序,时间复杂度也就等于比较的次数 外部排序:数据量很大,内存无法容纳,需要对外存进行访问再排序,把若干段数据一次读 ...

  8. 单片机DIY制作-基于STM32单片机甲醛二氧化碳温度湿度采集系统

    基于STM32单片机甲醛二氧化碳温度湿度采集系统 实践制作DIY-GC008-甲醛二氧化碳温度湿度采集系统 一.功能说明: 基于STM32单片机设计-甲醛二氧化碳温度湿度采集系统 二.功能介绍: 1. ...

  9. Java多线程—线程同步(单信号量互斥)

    JDK中Thread.State类的几种状态 线程的生命周期         线程的安全问题(同步与互斥) 方法一:同步代码块 多个线程的同步监视器(锁)必须的是同一把,任何一个类的对象都可以 syn ...

  10. 4 个超实用的 Linux 监控工具

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 下面是 Linux 下 4 个日常使用率非常高的监控工具,可以帮助我们准确快速的诊断系统问题. 1. iotop 如果你想知 ...