Posted in Java, 技术

代码片段:基于 JDK 8 time包的时间工具类 TimeUtil

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“知识的工作者必须成为自己时间的首席执行官。”

前言

这次泥瓦匠带来的是一个好玩的基于 JDK 8 time包的时间工具类 TimeUtil。本意,用 JDK 8 写个实战的时间工具类,初版泥瓦匠写的很不好,后来雨神分分钟将这个代码优化优化,谢谢雨神。就此分享下这个代码,让更多的人看到~

一、 Java 8 time包

从 Java 1.0 有个 Date 类,想必大家不陌生,后面有了 Calendar 类(被废弃 )。API 确实比较难用,因此 Java 8 引入 java.time API,这次看看是不是很好用。大致引入了这几个对象:

  • Instant – 瞬间类,表示时间线上的一点(与 Date 类似)
  • Duration – 持续时间,表示两个 Instant 之间的时间
  • LocalDateTime – 本地日期时间,表示一个日期和时间。

本小文重点还是在使用 LocalDateTime 及其格式化类 DateTimeFormatter

二、介绍 LocalDateTime & DateTimeFormatter APIs

LocalDateTime 表示一个日期和时间,存储确定时区中的某个时间点。
例如某一次练书法弹琴活动。(ps:泥瓦匠有个小圈子,里面喜欢加入一些文艺的程序员。爱技术,爱生活,爱艺术~ 雨神就爱弹琴,日语思密达*&#@#% )

常用api:

  • now()
    从系统中获取当前时间
  • parse(CharSequence text, DateTimeFormatter formatter)
    从字符串按格式获取 LocalDateTime 实例

DateTimeFormatter 用于格式化时间,提供了公用的方法入口,打印和解析格式化的时间类。

常用api:

  • format(TemporalAccessor temporal)
    按格式格式化时间
  • ofPattern(String pattern)
    按字符串指定的格式,生成时间格式

 

三、TimeUtil 代码详解

泥瓦匠一一道来这个代码的实现。先看代码:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 基于 JDK 8 time包的时间工具类
 * <p/>
 * Created by bysocket on 16/8/23.
 */
public final class TimeUtil {

    /**
     * 获取默认时间格式: yyyy-MM-dd HH:mm:ss
     */
    private static final DateTimeFormatter DEFAULT_DATETIME_FORMATTER = TimeFormat.LONG_DATE_PATTERN_LINE.formatter;

    private TimeUtil() {
        // no construct function
    }

    /**
     * String 转时间
     *
     * @param timeStr
     * @return
     */
    public static LocalDateTime parseTime(String timeStr) {
        return LocalDateTime.parse(timeStr, DEFAULT_DATETIME_FORMATTER);
    }

    /**
     * String 转时间
     *
     * @param timeStr
     * @param format  时间格式
     * @return
     */
    public static LocalDateTime parseTime(String timeStr, TimeFormat format) {
        return LocalDateTime.parse(timeStr, format.formatter);
    }

    /**
     * 时间转 String
     *
     * @param time
     * @return
     */
    public static String parseTime(LocalDateTime time) {
        return DEFAULT_DATETIME_FORMATTER.format(time);
    }

    /**
     * 时间转 String
     *
     * @param time
     * @param format 时间格式
     * @return
     */
    public static String parseTime(LocalDateTime time, TimeFormat format) {
        return format.formatter.format(time);
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    public static String getCurrentDatetime() {
        return DEFAULT_DATETIME_FORMATTER.format(LocalDateTime.now());
    }

    /**
     * 获取当前时间
     *
     * @param format 时间格式
     * @return
     */
    public static String getCurrentDatetime(TimeFormat format) {
        return format.formatter.format(LocalDateTime.now());
    }

    /**
     * 时间格式
     */
    public enum TimeFormat {

        /**
         * 短时间格式
         */
        SHORT_DATE_PATTERN_LINE("yyyy-MM-dd"),
        SHORT_DATE_PATTERN_SLASH("yyyy/MM/dd"),
        SHORT_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd"),
        SHORT_DATE_PATTERN_NONE("yyyyMMdd"),

        /**
         * 长时间格式
         */
        LONG_DATE_PATTERN_LINE("yyyy-MM-dd HH:mm:ss"),
        LONG_DATE_PATTERN_SLASH("yyyy/MM/dd HH:mm:ss"),
        LONG_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss"),
        LONG_DATE_PATTERN_NONE("yyyyMMdd HH:mm:ss"),

        /**
         * 长时间格式 带毫秒
         */
        LONG_DATE_PATTERN_WITH_MILSEC_LINE("yyyy-MM-dd HH:mm:ss.SSS"),
        LONG_DATE_PATTERN_WITH_MILSEC_SLASH("yyyy/MM/dd HH:mm:ss.SSS"),
        LONG_DATE_PATTERN_WITH_MILSEC_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss.SSS"),
        LONG_DATE_PATTERN_WITH_MILSEC_NONE("yyyyMMdd HH:mm:ss.SSS");

        private transient DateTimeFormatter formatter;

        TimeFormat(String pattern) {
            formatter = DateTimeFormatter.ofPattern(pattern);
        }
    }
}

工具类由 final TimeUtil类 及 其内部枚举类TimeFormat时间格式类 组成。
1/ TimeUtil 具有私有构造函数,表示被保护,无法被外部 new 出实例。

声明了默认的  DateTimeFormatter 时间格式:yyyy-MM-dd HH:mm:ss。其他则是提供了 获取当前时间 和 时间与String互转的方法。
2/ TimeFormat 内部枚举类,首先它是单例的。

transient 关键字目的是确保 DateTimeFormatter 无序列化存储。为啥单例,因为 DateTimeFormmatter 是无状态的,可以线程共享。

具体方法解析如下:
1. 获取当前时间

String now = TimeUtil.getCurrentDatetime();
System.out.println(now);
output:
2016-08-28 16:35:23

2. 获取当前相应格式的当前时间

String now = TimeUtil.getCurrentDatetime(TimeUtil.TimeFormat.LONG_DATE_PATTERN_SLASH);
System.out.println(now);
output:
2016/08/28 16:36:24

3. String 转时间
默认格式:yyyy-MM-dd HH:mm:ss

LocalDateTime expectedDateTime = LocalDateTime.of(2014, 11, 11, 10, 11, 11);
LocalDateTime parsedTime = TimeUtil.parseTime("2014-11-11 10:11:11");
assertEquals(expectedDateTime, parsedTime);

其他格式之一:yyyy-MM-dd HH:mm:ss

LocalDateTime expectedDateTime = LocalDateTime.of(2014, 11, 11, 10, 11, 11);
LocalDateTime parsedTime = TimeUtil.parseTime("2014/11/11 10:11:11", LONG_DATE_PATTERN_SLASH);
assertEquals(expectedDateTime, parsedTime);

4. 时间转 String
默认格式:yyyy-MM-dd HH:mm:ss

LocalDateTime time = LocalDateTime.of(2014, 11, 11, 10, 11, 11);
assertEquals(TimeUtil.parseTime(time), "2014-11-11 10:11:11");

其他格式之一:yyyy-MM-dd HH:mm:ss

LocalDateTime time = LocalDateTime.of(2014, 11, 11, 10, 11, 11);
assertEquals(TimeUtil.parseTime(time, LONG_DATE_PATTERN_DOUBLE_SLASH), "2014\\11\\11 10:11:11");

 

四、与 Old 代码互操作

java.time 类与 Old Date 代码互操作如下图:

time

 

五、小结

实战中的 JDK8 ,Show the code。 在用的项目,完善测试时候用起来才是关键。自然需要 JDK 环境支持,升级吧升级吧。
基于 JDK 8 time包的实践,这次只讲了 LocalDateTime 类,慢慢带来更多。
相关代码分享在 Github 主页

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

 

时间啊 时间啊,来发反鸡汤
72e172b3gw1f5tlp60gryj20je0m8ta0

Posted in Java, 技术

fast-framework – 基于 JDK 8 实现的 Java Web MVC 框架

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

fast-framework


轻量级 Java Web 框架 – https://github.com/JeffLi1993/fast-framework

  • 基于 JDK 8 规范
  • 基于 Servlet 3.0 规范
  • 零配置
  • REST 服务接口 基于 JSON 传输
  • 目前提供 MVC … 解决方案

 

一、作者与学习乐园

源码地址:我的GitHub地址
作者: 李强强 也叫 泥瓦匠
QQ群:编程之美 365234583 立即加入

二、快速入门

1. 必备环境

2. 下载 fast-framework 项目及 sample 案例

git clone https://github.com/JeffLi1993/fast-framework.git

3. Maven 编译 sample 案例

cd fast-framework // cd 到工程根目录

mvn clean install // 编译工程

4. 启动 sample 案例

cd fast-sample // cd 到 sample 案例工程根目录
mvn jetty:run  // 启动 sample 工程

Console 出现如下结果,表示服务器成功启动:

...
[INFO] Started ServerConnector@f1a45f8{HTTP/1.1}{0.0.0.0:8080}
[INFO] Started @5133ms
[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 10 seconds.

5. 访问 sample

在浏览器中打开:

http://localhost:8080/hello?name=BYSocket

会得到如下结果:
sample结果图

 

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

 

Posted in Working Skills, 技术

配置Maven

采用maven管理模块工程的编译、发布。通俗的讲,就是利用maven来管理各项目。

一、Maven下载

Maven官网地址:http://maven.apache.org

二、Maven环境搭建

Windows 用户配置如下:右键”计算机” —  “属性” — “高级系统设置” — “环境变量” — “系统变量”

1. 下载 apache-maven-3.1.1.zip

2. 配置环境变量

     M2_HOME  — 配置Maven安装路径

     PATH           — 配置Maven命令文件的位置 (%M2_HOME%\bin;)

三、校验环境是否配置完毕

“win键” — 运行”cmd” ,在控制台中输入 mvn -version。如果出现下面界面,则说明环境配置完成。

 

Maven的settings.xml配置

使用默认即可。

常用指令

mvn

├── clean  清理项目

├── install 安装jar到本地仓库

├── archetype:generate  创建maven项目目录

一般利用 mvn archetype:generate 创建生成骨架工程。还有开发或构建项目,经常使用到clean和install。

Posted in 清文

2016 6月 7月 随笔

首先在6月,写了很多好多好玩的文案

4.pic

3.pic

2.pic

1.pic

…… 等等


2016-06-28 白领

到家了,看到镜子前深夜里自己的她,卸了装后完全看清了自己


2016-06-30 睡衣

只有睡衣穿久了 才真正有你的味道


2016-07-01 野鸭

野鸭,不像家禽那个肥大,也不像家禽那么绚丽。批着防御大自然的颜色,敏捷的钻水捕鱼


2016-07-10 随笔

双胞胎的孩子 在双人娃娃椅上 一个睡着 一个动着


2016-07-20 随笔

往往就是这种不太大的、微不足道的变化,对我们的未来有着深远影响— 蝴蝶效应


2016-08-01 走路

不看路走的人容易踩狗屎

8月开始了。。。

祝自己别踩狗屎