Java8日期格式化

Java8之前的版本,格式化日期常使用SimpleDateFormat,但这个类并不是线程安全的,通常要用作局部变量或者使用ThreadLocal包装。或者使用额外的joda time 依赖来对日期进行操作。

但是到了Java8,这类烦恼都没有了,全新的日期api可以快速实现日期格式化。

1.日期格式化-字符串转换成日期

    /**
     * 将不带时间的日期字符串转为日期
     *
     * @param dateStr 字符串
     * @param format  该字符串对应的日期格式,必须一一对应,否则返回null
     * @return 日期对象,当格式不匹配会返回null
     */
    public static Date toDate(String dateStr, String format) {
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(format);
        try {
            LocalDate localDate = LocalDate.parse(dateStr, inputFormatter);
            ZoneId defaultZoneId = ZoneId.systemDefault();
            return Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 将带时间的格式转换为日期
     * @param dateStr 字符串
     * @param format 该字符串对应的日期时间格式,必须一一对应,否则返回null
     * @return 日期对象,当格式不匹配会返回null
     */
    public static Date toDateTime(String dateStr, String format) {
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(format);
        try {
            LocalDateTime localDateTime = LocalDateTime.parse(dateStr, inputFormatter);
            ZoneId defaultZoneId = ZoneId.systemDefault();
            ZonedDateTime zdt = localDateTime.atZone(defaultZoneId);
            return Date.from(zdt.toInstant());
        } catch (Exception e) {
            return null;
        }
    }

测试代码及输出:

        String str4 = "2022-08-16";
        System.out.println(toDate(str4, "yyyy-MM-dd"));
        String str5 = "2022-08-16 12:05:24";
        System.out.println(toDateTime(str5, "yyyy-MM-dd HH:mm:ss"));
Tue Aug 16 00:00:00 CST 2022
Tue Aug 16 12:05:24 CST 2022

2.日期字符串转换

  /**
   * 不带时分秒的日期字符串转化
   *
   * @param input 输入的日期
   * @param inputFormat 输入日期的格式
   * @param outputFormat 输出日期的格式
   * @return 输出的日期,不带时分秒
   */
  public static String formattedDate(String input, String inputFormat, String outputFormat) {
    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputFormat);
    LocalDate localDate = LocalDate.parse(input, inputFormatter);

    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputFormat);
    return localDate.format(outputFormatter);
  }

测试代码及输出:

    String output1 = formattedDate("2019年07月15日", "yyyy年MM月dd日", "yyyy-MM-dd");
    String output2 = formattedDate("2019/07/16", "yyyy/MM/dd", "yyyy-MM-dd");
    String output3 = formattedDate("2019-07-16", "yyyy-MM-dd", "yyyy/MM/dd");

    System.out.println(output1);
    System.out.println(output2);
    System.out.println(output3);
2019-07-15
2019-07-16
2019/07/16

注意,使用LocalDate + DateTimeFormatter仅仅能够转换不带时分秒的日期格式!

3.带时间日期字符串转换

  /**
   * 带时分秒的日期字符串转换
   *
   * @param input 输入的日期
   * @param inputFormat 输入日期的格式
   * @param outputFormat 输出日期的格式
   * @return 输出指定格式的日期,可以带时分秒,也可以不带
   */
  public static String formattedDateTime(String input, String inputFormat, String outputFormat) {
    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputFormat);
    LocalDateTime localDateTime = LocalDateTime.parse(input, inputFormatter);

    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputFormat);
    return localDateTime.format(outputFormatter);
  }

测试代码及输出:

    String output1 = formattedDateTime("20190713000000", "yyyyMMddHHmmss", "yyyy-MM-dd");
    String output2 = formattedDateTime("20190713000000", "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss");

    String output3 = formattedDateTime("2019年07月14日00时00分00秒", "yyyy年MM月dd日HH时mm分ss秒",
        "yyyy/MM/dd");
    String output4 = formattedDateTime("2019年07月14日00时00分00秒", "yyyy年MM月dd日HH时mm分ss秒",
        "yyyyMMddHHmmss");

    String output5 = formattedDateTime("2019-07-15 00:00:00", "yyyy-MM-dd HH:mm:ss", "yyyyMMdd");
    String output6 = formattedDateTime("2019-07-15 00:00:00", "yyyy-MM-dd HH:mm:ss",
        "yyyy年MM月dd日HH时mm分ss");

    System.out.println(output1);
    System.out.println(output2);
    System.out.println(output3);
    System.out.println(output4);
    System.out.println(output5);
    System.out.println(output6);
2019-07-13
2019-07-13 00:00:00
2019/07/14
20190714000000
20190715
2019年07月15日00时00分00

注意:使用LocalDateTime +  DateTimeFormatter 可以将指定日期类型转换成任意形式的日期类型。

4.Date和LocalDateTime互转

  /**
   * LocalDateTime -> Date
   */
  public static Date toDate(LocalDateTime localDateTime) {
    ZoneId zoneId = ZoneId.systemDefault();
    ZonedDateTime zdt = localDateTime.atZone(zoneId);
    return Date.from(zdt.toInstant());
  }

  /**
   * Date -> LocalDateTime
   */
  public static LocalDateTime toLocalDateTime(Date date) {
    Instant instant = date.toInstant();
    ZoneId zoneId = ZoneId.systemDefault();
    return instant.atZone(zoneId).toLocalDateTime();
  }

5.Date和LocalDate互转

    /**
     * Date -> LocalDateTime
     */
    public static LocalDateTime toLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        return instant.atZone(zoneId).toLocalDateTime();
    }

    /**
     * LocalDate -> Date
     */
    public static Date toDate(LocalDate localDate) {
        ZoneId defaultZoneId = ZoneId.systemDefault();
        return Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
    }

6.为什么推荐使用DateTimeFormatter而不是SimpleDateFormat

不仅仅安全,而且更加严格。

举例:当日期格式为 yyyy-MM-dd,输入日期为2022-8-16,对于SimpleDateFormat即使设置强校验模式,依然能够转换成功,但是对于DateTimeFormatter则会转换失败

        String str = "2022-8-16";
        System.out.println(toDate(str, "yyyy-MM-dd"));
        String str2 = "2022-8-16";
        System.out.println(toDateUseSdf(str2, "yyyy-MM-dd"));
    public static Date toDateUseSdf(String dateStr, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setLenient(true);
        try {
            return sdf.parse(dateStr);
        } catch (Exception e) {
            return null;
        }
    }

分别输出null和 Tue Aug 16 00:00:00 CST 2022

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Java 8中,时间格式化可以使用java.time包中的DateTimeFormatter类来完成。以下是一个简单的例子: ```java import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { // 获取当前时间 LocalDateTime now = LocalDateTime.now(); // 创建一个格式化器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 格式化时间 String formattedDateTime = now.format(formatter); // 输出格式化后的时间 System.out.println("当前时间: " + formattedDateTime); } } ``` 在上面的例子中,我们首先使用`LocalDateTime.now()`方法获取当前时间。然后,我们创建一个格式化器对象`DateTimeFormatter`,并使用`ofPattern()`方法指定要使用的日期时间格式。最后,我们使用`format()`方法将时间格式化为字符串。 输出将类似于以下内容: ``` 当前时间: 2023-02-16 10:30:45 ``` 您可以根据需要修改日期时间格式。更多有关Java 8日期时间API的信息,请参考[官方文档](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)。 ### 回答2: Java 8引入了新的时间日期API,其中包含了方便的时间格式化功能。通过使用DateTimeFormatter类,我们可以将时间对象转换为格式化的字符串。 首先,我们需要创建一个格式化模板,以指定所需的时间格式。模板使用预定义的格式化符号来表示不同的时间单位,例如年份使用"yyyy",月份使用"MM",日期使用"dd",小时使用"HH",分钟使用"mm",秒钟使用"ss"等等。可以根据需要进行组合和排列。 然后,我们可以使用DateTimeFormatter类的ofPattern方法创建一个格式化器对象,将模板作为参数传递进去。 接下来,我们可以使用格式化器对象的format方法将时间对象转换为字符串,代码示例如下: ```java import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { // 创建时间对象 LocalDateTime now = LocalDateTime.now(); // 创建格式化模板 String pattern = "yyyy-MM-dd HH:mm:ss"; // 创建格式化器对象 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); // 格式化时间对象为字符串 String formattedDateTime = now.format(formatter); System.out.println(formattedDateTime); } } ``` 上述代码将当前时间对象格式化为"yyyy-MM-dd HH:mm:ss"的字符串格式,并将其打印输出。 需要注意的是,DateTimeFormatter类还提供了许多其他方法和选项,可以根据需要对时间进行格式化,例如指定不同的区域设置、时区、语言等。在使用时间格式化时,我们可以根据实际需求选择合适的选项和方法。 ### 回答3: Java 8引入了一个新的时间日期API,可以方便地对时间进行格式化。在Java中,我们可以使用DateTimeFormatter类来指定日期和时间的格式。以下是一些常用的时间格式化示例: 1. 格式化为字符串:可以使用DateTimeFormatter类的ofPattern()方法来创建一个格式化模式,并使用format()方法将时间对象格式化为字符串。 例如: ``` LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = now.format(formatter); System.out.println("格式化后的时间:" + formattedDateTime); ``` 输出结果类似于:格式化后的时间:2022-01-01 12:34:56 2. 解析字符串为时间:可以使用DateTimeFormatter类的parse()方法将字符串解析为时间对象。 例如: ``` String dateTimeString = "2022-01-01 12:34:56"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter); System.out.println("解析后的时间:" + parsedDateTime); ``` 输出结果类似于:解析后的时间:2022-01-01T12:34:56 3. 调整格式:可以使用withPattern()方法来调整已有的DateTimeFormatter的格式。 例如: ``` LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter adjustedFormatter = formatter.withPattern("yyyy/MM/dd HH:mm"); String adjustedDateTime = now.format(adjustedFormatter); System.out.println("调整格式后的时间:" + adjustedDateTime); ``` 输出结果类似于:调整格式后的时间:2022/01/01 12:34 通过使用Java 8的时间日期API和DateTimeFormatter类,我们可以方便地进行时间格式化操作,从而满足各种不同的格式要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alphathur

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值