使用Java编写一个日期时间封装类
- 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编写一个日期时间封装类的更多相关文章
- java设定一个日期时间,加几分钟(小时或者天)后得到新的日期
//返回的是字符串型的时间,输入的 //是String day, int x public static String addDateMinut(String day, int x){ SimpleD ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- Java 8 新日期时间 API
Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...
- java创建Date日期时间笔记
(1)public Date() 创建的日期类对象的日期时间被设置成创建时刻相对应的日期时间. 例: Java代码 1.Date today=new Date(); //today被设置成创建时刻相 ...
- java里的日期时间
为了更好理解java的日期时间类,在这里我们先介绍一下关于历法.标准时间的一些概念. 历法有很多种,我们大中华上下五千年,自然也有自己的历法,生活中我们通常把自己传统的历法叫做农历,也有人叫它阴历或夏 ...
- java android中日期时间 问题总结
Date 类型: Date date = new Date(); // 代表获取当前系统日期和时间 System.out.println(date); 使用类的方法设置时间和日期:(通过该方法初始 ...
- java基础之日期时间工具类
package zy.test; import java.sql.Timestamp; import java.text.ParseException; import java.text.ParseP ...
- Java判断一个日期是否在下周日期区间
Java实现判断一个日期是否在下周日期区间的方法 /** * 判断输入的日期是否在下周区间 * @return * @author nemowang */ public static boolean ...
- 面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况
题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输 ...
随机推荐
- 这个API Hub厉害了,收录了钉钉企业微信等开放Api,还能直接调试
01 此前时不时会有一些研发小伙伴和我诉苦,说很多企业由于人力财力限制或者需求不强,会直接购买使用第三方的开放API,这样一来, 一则由于开放项目不是量身定制的,寻找自己合适的接口也要搜索调研蛮多时间 ...
- 【多线程与高并发原理篇:3_java内存模型】
1. 概述 Java 内存模型即 Java Memory Model,简称 JMM.从抽象的角度来看,JMM 定义了线程和主内存之间的抽象关系,线程之间的共享变量存储在主内存中,每个线程都有一个私有的 ...
- vue-mobile-template 前端开源框架
开源项目的由来 某天因公司业务需求,想寻找一款H5移动端的模板进行二次开发.但搜遍整个HUB都没法找到合适的空模板进行二次开发,所以心血来潮,于是有了 vue-mobile-template . 介绍 ...
- Asp.Net在线预览Word文档的解决方案与思路
前几天有个老项目找到我,有多老呢?比我工作年限都长,见到这个项目我还得叫一声前辈. 这个项目目前使用非常稳定,十多年了没怎么更新过,现在客户想加一个小功能:在线预览Word文档. 首先想到的是用第三方 ...
- 『现学现忘』Git对象 — 16、Tree对象详解
目录 1.Tree对象介绍 2.Tree对象说明 (1)初始化一个新的本地版本库 (2)创建一个树对象(重点) (3)创建第二个文件(重点) (4)将第一个树对象加入暂存区,使其成为新的树对 3.总结 ...
- JavaWeb之如何把请求数据转成实体类
JavaWeb之如何把请求数据转成实体类 自己写个工具类加入下面两个静态方法 自定一个注解类DateTimeFormatting 调用方式User user = util.ObjectFromMap( ...
- java实现空心金字塔
前言 最近在学习java,遇到了一个经典打印题目,空心金字塔,初学者记录,根据网上教程,有一句话感觉很好,就是先把麻烦的问题转换成很多的简单问题,最后一一解决就可以了,然后先死后活,先把程序写死,后面 ...
- this 去哪?
this 去哪? 本文写于 2020 年 4 月 26 日 let obj = { foo() { console.log(this) }, } let bar = obj.foo obj.foo() ...
- Spring事务源码解读
一.Spring事务使用 1.通过maven方式引入jar包 <dependency> <groupId>com.alibaba</groupId> <art ...
- 【多线程】创建线程方式一:继承Thread类
创建线程方式一:继承Thread类 代码示例: /** * @Description 继承Thread类,重写run方法,调用start开启线程 * @Author hzx * @Date 2022- ...