java DateFormat的自定义pattern的格式解析规则:忽略特定的单词

本文介绍了一种自定义日期格式处理类AdvanceDateFormat的实现方法,该类扩展了Java的DateFormat类,能够忽略pattern中的特定单词,并按照自定义脚本进行日期解析和格式化,解决了simpleDateFormat在复杂需求场景下的局限性。
摘要由CSDN通过智能技术生成

自定义DateFormat

开发中最常用的日期解析类是simpleDateFormat,往往能完成大部分对日期解析、或者转成固定格式字符串的需求。但有时候对pattern的解析有更加复杂的需求,比如忽略掉pattern中的某些单词,或者按照自定义的脚本进行解析,这时候就需要自己定义规则了。

举个例子来说,希望将2020/8/29 转换成 “FY2020”来展示,如果pattern是“FYyyyy”,明显解析出来的结果并不是我们想要的。

以该需求为例,下面自定义一个日期处理类AdvanceDateFormat

package date;

import java.text.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.*;

public class AdvanceDateFormat extends DateFormat {
   public AdvanceDateFormat(String pattern, String ignoreWord) {
      this.fmt = createDateFormat(pattern, ignoreWord);
   }
   
   /**
    * 格式化时间
    * */
   @Override
   public StringBuffer format(Date date, StringBuffer stringBuffer, FieldPosition fieldPosition) {
      Calendar cal = Calendar.getInstance();
      cal.setTime(date);
      LocalDateTime ldate = LocalDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1,
            cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE),
            cal.get(Calendar.SECOND));
      return stringBuffer.append(this.fmt.format(ldate));
   }

   @Override
   public Date parse(String s, ParsePosition parsePosition) {
      // do nothing
      return null;
   }

   /**
    * 构造DateTimeFormatter
    * */
   private DateTimeFormatter createDateFormat(String pattern, String ignoreWord) {
      DateTimeFormatterBuilder dateTimeFormatterBuilder = new DateTimeFormatterBuilder();

      while(pattern.length() > 0) {  
         if(pattern.startsWith(ignoreWord)) {   
            dateTimeFormatterBuilder.appendLiteral(ignoreWord);//处理需要忽略的单词
            pattern = pattern.replace(ignoreWord, "");
         }
         else if(pattern.indexOf(ignoreWord) > 0) {
            String patternStr = pattern.substring(0, pattern.indexOf(ignoreWord));
            dateTimeFormatterBuilder.appendPattern(patternStr);//添加pattern
            pattern = pattern.replace(ignoreWord, "");
         }
         else {
            dateTimeFormatterBuilder.appendPattern(pattern);//添加pattern
            pattern = pattern.replace(pattern, "");
         }
      }

      return dateTimeFormatterBuilder.toFormatter();
   }

   private DateTimeFormatter fmt;
}

测试类

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

import date.AdvanceDateFormat;

/**
 * @program: test2
 *
 * @description
 *
 * @author: Samur
 *
 * @create: 2020-05-22 17:01
 **/
public class Test {
   public static void main(String[] args) {
      String pattern = "FYyyyy";
      Date date = new Date();
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);//使用simpleDateFormat 格式化时间
      String dateStr = simpleDateFormat.format(date);
      System.out.println(dateStr);
      System.out.println("=========================================");
      AdvanceDateFormat advanceDateFormat = new AdvanceDateFormat(pattern, "FY");
      String dateFormat = advanceDateFormat.format(date).toString();
      System.out.println(dateFormat);
   }
}

测试结果

520202020
=========================================
FY2020

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值