java8日期工具类封装的实战记录

Java8日期工具类封装的实战记录

介绍

Java8中提供的日期时间API可以更方便地处理时间日期相关的操作,提高开发效率,提高代码可读性。但是,在实际项目中,我们需要将这些API封装成工具类,方便在整个项目中使用。本文将介绍如何封装Java8日期时间API,以及如何在项目中应用。

封装Java8日期工具类

创建工具类

创建一个名为DateUtil的工具类,代码如下:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class DateUtil {

    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * Date 转 LocalDate
     *
     * @param date
     * @return
     */
    public static LocalDate dateToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * Date 转 LocalDateTime
     *
     * @param date
     * @return
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * LocalDate 转 Date
     *
     * @param localDate
     * @return
     */
    public static Date localDateToDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * LocalDateTime 转 Date
     *
     * @param localDateTime
     * @return
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 格式化日期
     *
     * @param date
     * @param format
     * @return
     */
    public static String formatDate(Date date, String format) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return formatter.format(dateToLocalDateTime(date));
    }

    /**
     * 获取当前日期
     *
     * @return
     */
    public static LocalDate getCurrentLocalDate() {
        return LocalDate.now();
    }

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

    /**
     * 获取当前日期时间字符串
     *
     * @return
     */
    public static String getCurrentDateTimeString() {
        return formatLocalDateTimeToString(getCurrentLocalDateTime(), DEFAULT_DATE_TIME_FORMAT);
    }

    /**
     * LocalDateTime格式化为字符串
     *
     * @param localDateTime
     * @param format
     * @return
     */
    public static String formatLocalDateTimeToString(LocalDateTime localDateTime, String format) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return formatter.format(localDateTime);
    }
}

测试工具类

为了验证工具类的正确性,我们可以编写以下两个测试用例:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

public class DateUtilTest {

    @Test
    public void testDateToLocalDate() {
        Date date = new Date();
        LocalDate localDate = DateUtil.dateToLocalDate(date);
        assertEquals(localDate.getYear(), date.getYear() + 1900);
        assertEquals(localDate.getMonthValue(), date.getMonth() + 1);
        assertEquals(localDate.getDayOfMonth(), date.getDate());
    }

    @Test
    public void testDateToLocalDateTime() {
        Date date = new Date();
        LocalDateTime localDateTime = DateUtil.dateToLocalDateTime(date);
        assertEquals(localDateTime.getYear(), date.getYear() + 1900);
        assertEquals(localDateTime.getMonthValue(), date.getMonth() + 1);
        assertEquals(localDateTime.getDayOfMonth(), date.getDate());
        assertEquals(localDateTime.getHour(), date.getHours());
        assertEquals(localDateTime.getMinute(), date.getMinutes());
        assertEquals(localDateTime.getSecond(), date.getSeconds());
    }
}

工具类应用实例

示例一

我们将使用Java8日期工具类在Spring MVC项目中实现一个日期参数自动绑定的操作。在Spring MVC中,我们可以通过注解@InitBinder来实现这个自动绑定。

在Controller中加入以下代码:

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

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

@Controller
public class HomeController {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String test(Date date) {
        System.out.println(date);
        return "success";
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }
}

我们会发现,在使用Java8日期类作为参数时,会报如下错误:

Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'

为了解决这个问题,我们需要写一个自定义的日期类型转换器,而这个日期类型转换器会使用我们封装好的Java8日期工具类。修改HomeController

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

@Controller
public class HomeController {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String test(Date date) {
        System.out.println(date);
        return "success";
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);

        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
        registrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        registrar.registerFormatters(conversionService);

        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        binder.registerCustomEditor(LocalDate.class, new LocalDatePropertyEditor(conversionService));
        binder.registerCustomEditor(LocalDateTime.class, new LocalDateTimePropertyEditor(conversionService));
    }
}

示例二

我们在Spring Boot项目中使用Hibernate来操作数据库,使用Java8日期工具类对Hibernate中的日期时间类型进行自动映射。

我们需要在src/main/resources/application.properties中添加以下配置:

# MySQL
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

# Hibernate
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jackson.serialization.indent_output=true

# Use Java8 Clock specification as opposed to System.currentTimeMillis().
spring.data.jpa.convert.threeten=true

其中,spring.data.jpa.convert.threeten属性设为true表示采用Java8日期类来进行时间戳的转换。

我们需要在实体类中使用Java8日期类进行日期时间类型的定义,例如:

import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(name = "create_date")
    private LocalDate createDate;

    @Column(name = "create_time")
    private LocalDateTime createTime;

    // 省略getter和setter方法
}

我们的UserRepository接口可以这样写:

import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {
}

并且我们可以直接在Controller中使用UserRepository来进行数据库操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Controller
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<String> addUser(@RequestParam("username") String username,
                                           @RequestParam("password") String password,
                                           @RequestParam("createDate") LocalDate createDate,
                                           @RequestParam("createTime") LocalDateTime createTime) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setCreateDate(createDate);
        user.setCreateTime(createTime);
        userRepository.save(user);
        return new ResponseEntity<>("OK", HttpStatus.OK);
    }

    @RequestMapping(value = "/list", method = RequestMethod.GET)
    @ResponseBody
    public List<User> listUser() {
        return (List<User>) userRepository.findAll();
    }
}

总结

本文介绍了如何封装Java8日期工具类,以及如何在Spring MVC和Spring Boot项目中应用Java8日期类。Java8日期类的使用可以有效地提高代码可读性和开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java8日期工具类封装的实战记录 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Javaweb实战之实现蛋糕订购系统

    Javaweb实战之实现蛋糕订购系统攻略 1. 第一步:环境搭建 在开始实现蛋糕订购系统前,需要搭建好开发环境。首先需要安装JDK和Tomcat,并且配置好环境变量。 其中JDK是Java开发包,Tomcat是一个开放源代码的Web应用服务器,主要用于处理Java Servlet和JavaServer Pages。 2. 第二步:数据库设计 在开始编写代码前…

    Java 2023年5月20日
    00
  • SpringBoot Mybatis 配置文件形式详解

    讲解 “SpringBoot Mybatis 配置文件形式详解” 的完整攻略如下: 1. 概述 Spring Boot 是 Spring Framework 的一种快速开发框架,可以用于 Java 开发的各种 Web 应用程序的快速开发。MyBatis 是一种持久层框架,可以用于与数据库交互的对象映射。本文介绍了如何使用 MyBatis 在 Spring B…

    Java 2023年5月20日
    00
  • SQLite教程(七):数据类型详解

    下面是对 “SQLite教程(七):数据类型详解” 的完整攻略: 标题 SQLite教程(七):数据类型详解 内容 1. 数据类型 SQLite3 中包含了以下 5 种基本的数据类型: NULL 空值。 INTEGER 带符号的整型,具体取决于值的大小。 REAL 用于存储浮点数。 TEXT 用于存储字符串。 BLOB 用于存储二进制数据。 2. 示例 下面…

    Java 2023年5月26日
    00
  • Java后台与微信小程序的数据交互实现

    针对“Java后台与微信小程序的数据交互实现”的问题,我们需要采取以下步骤: 1.编写Java后台 Java后台需要使用Spring Boot框架及Spring Data JPA作为数据持久层框架。 1.1.实现数据模型 首先,我们需要根据需求在Java后台中实现相关的数据模型,比如我们需要创建一个用户模型,代码如下: @Entity @Table(name…

    Java 2023年5月30日
    00
  • Java 逻辑控制详解分析

    Java 逻辑控制详解分析 概述 逻辑控制是程序设计中最基本的概念之一,它能够控制程序的流程、分支、循环等,以达到特定的目的。在 Java 编程语言中,逻辑控制主要包括条件语句、循环语句、跳转语句等。本文将从这三个方面详细介绍 Java 逻辑控制的使用方法。 条件语句 条件语句主要包括 if 和 switch 两种语句,它们都是通过判断条件来决定程序的执行流…

    Java 2023年5月23日
    00
  • 黑客如何利用文件包含漏洞进行网站入侵

    黑客通过利用文件包含漏洞,可以轻松地将自己的代码注入到网站服务器中,从而实现对网站的入侵。下面是黑客会使用的一些攻击方法和技术: 使用文件包含漏洞的攻击方法 抓取页面源代码 黑客可以访问页面的URL,并使用一些指定的参数来获取页面的源代码。一旦黑客获取了页面的源代码,就可以查看其中是否存在文件包含漏洞。 判断漏洞类型 黑客可以通过分析页面源代码,判断该漏洞是…

    Java 2023年6月15日
    00
  • spring注解@Service注解的使用解析

    现在我就为你详细讲解使用Spring中的@Service注解的完整攻略。 什么是@Service注解 在Spring中,@Service注解用来标注业务层(Service层)组件,将业务逻辑封装在Service层,通过@Service注解告诉Spring容器需要将这个类识别为Service层的组件,从而进行自动注入和管理。与@Controller注解和@Re…

    Java 2023年5月31日
    00
  • Java实现输出回环数(螺旋矩阵)的方法示例

    以下是Java实现输出回环数(螺旋矩阵)的方法示例的完整攻略: 目录 什么是回环数 方案分析 Java实现方案 示例1 示例2 什么是回环数 回环数,也叫螺旋矩阵,是一个由外向内逐层递进的n * n矩阵。例如n = 4时,回环数如下所示: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 在这个矩阵中,1-4是第一层,5-14是第…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部