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日

相关文章

  • Java中的Random()函数及两种构造方法

    Java中的Random()函数及两种构造方法 在Java中,java.util.Random是一个用于生成伪随机数的类。它有两种构造方法,可以实现不同用途的随机数生成。 1. Random()函数 Random()函数是java.util.Random类的默认构造方法。该构造方法将当前时间戳作为种子,可以生成一个伪随机数: import java.util…

    Java 2023年5月26日
    00
  • Java实现文件上传和下载的方法详解

    Java实现文件上传和下载的方法详解 文件上传 文件上传是通过HTTP协议中的POST方法进行实现的。在Java中,常见的实现方式有两种: 1. 使用Servlet API Servlet API 提供了实现文件上传的类 javax.servlet.http.Part。我们可以通过 request.getParts() 方法来获取所有上传的文件数据,然后进行…

    Java 2023年5月19日
    00
  • Java中使用HttpRequest获取用户真实IP地址

    获取用户真实IP地址是Web开发中一个非常重要的问题,这篇文章将详细讲解在Java中使用HttpRequest获取用户真实IP地址的完整攻略。 什么是用户真实IP地址 用户真实IP地址指的是用户连接Internet时获得的IP地址,这个IP地址被称为公网IP地址,因为这个IP地址是在Internet上唯一的,并且可以标识这个用户所在位置的唯一标识。 如何获取…

    Java 2023年6月15日
    00
  • Java设计模块系列之书店管理系统单机版(二)

    我来详细讲解一下“Java设计模块系列之书店管理系统单机版(二)”的完整攻略。 首先,这篇攻略是一篇关于书店管理系统的设计,主要包括从需求分析到具体实现的全过程。在设计的过程中,作者使用了MVC模式,分为Model、View和Controller三个部分,实现了对数据的管理。同时,作者还介绍了一些设计模式的应用,如装饰器模式、工厂模式和适配器模式等。 接着,…

    Java 2023年5月24日
    00
  • java基础的详细了解第一天

    Java基础的详细了解第一天 学习目标 了解Java语言的历史以及Java程序的运行过程 熟悉Java语言的基本语法和数据类型 掌握Java中的运算符,流程控制语句和数组 学会使用Java提供的标准输入输出和字符串操作方法 学习过程 Java语言的概述 Java是一门跨平台的计算机编程语言,它的应用范围广泛,可以用于Web应用、移动应用、桌面应用等。Java…

    Java 2023年5月19日
    00
  • jsp中实现上传图片即时显示效果功能

    要在JSP中实现上传图片即时显示效果的功能,可以采用以下步骤: 在JSP页面中添加上传文件表单和图片预览区域 <form action="upload.jsp" method="post" enctype="multipart/form-data"> <input type=&qu…

    Java 2023年6月15日
    00
  • 如何使用Java生成具有安全哈希的QR码

    让我来详细讲解如何使用Java生成具有安全哈希的QR码。 准备工作 首先,在使用Java生成QR码前,您需要先下载相应的库。 我们可以使用 Zxing 库来方便地生成QR码,并使用 Bouncy Castle 库来生成安全哈希。 为了使用这两个库,您需要添加以下依赖关系: <dependencies> <dependency> &lt…

    Java 2023年5月26日
    00
  • Java基本类型和运算符(面试题)

    下面我将详细讲解一下“Java基本类型和运算符(面试题)”的完整攻略。 Java基本类型 Java基本类型共有8种,分别为:byte、short、int、long、float、double、char、boolean,其对应的基本类型在内存中占用的空间及范围不同。具体的描述如下表所示: 类型 字节数 取值范围 byte 1 -128到+127 short 2 …

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