Discuss / Java / 使用静态工厂方法实现一个类似20200202的整数转换为LocalDate

使用静态工厂方法实现一个类似20200202的整数转换为LocalDate

Topic source

净净一隅

#1 Created at ... [Delete] [Delete and Lock User]

package tools.date;

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

public class LocalDateFactory {
public static LocalDate fromInt(int ld){
LocalDate dt = null;
String date=String.valueOf(ld);
if(date.length()!=8) {
throw new IllegalArgumentException("参数非法,请输入yyyyMMdd格式的数字:"+ld);
}
int year=Integer.parseInt(date.substring(0,4));
int month=Integer.parseInt(date.substring(4,6));
int day=Integer.parseInt(date.substring(6,8));
//判断year是否合法
/*
if(year<1900 || year > 9999){
throw new IllegalArgumentException("非法参数,年份不能超过1900~9999");
}*/
//判断month是否合法
if(month<=0 || month >12){
throw new IllegalArgumentException("非法参数,月份不能超过1~12");
}
//判断day是否合法
if(day<=0 || day >31){
throw new IllegalArgumentException("非法参数,日不能超过1~31");
}
//判断day是否合法
judgeDay(year,month,day);
dt=LocalDate.of(year,month,day);
return dt;
}
/**
*判断day是否合法
*/
static void judgeDay(int year,int month,int day){
Boolean leapYearFlag=judgeLeapYear(year);
//平年的2月不能超过28天
if((!leapYearFlag) && (month==2) && (day>28)){
throw new IllegalArgumentException("非法参数day:"+day+", "+year+"是平年,2月不能超过28天");
}
//闰年的2月不能超过29天
if(leapYearFlag && (month==2) && (day > 29)){
throw new IllegalArgumentException("非法参数day:"+day+", "+year+"是闰年,2月不能超过29天");
}
//小月不能超过30天
Boolean bigMonthFlag=judgeMonth(month);
if((!bigMonthFlag) && day > 30 ){
throw new IllegalArgumentException("非法参数day:"+day+", "+month+"月份不能超过30天");
}
}

/**
* 判断是否闰年
* @param year
* @return
*/
static boolean judgeLeapYear(int year){
//能被400整除的是闰年
if((year%400)==0){
return true;
}
//能被4整除但不能被100整除的是闰年
if ((year%4)==0 && (year%100)!=0){
return true;
}
//不满足上述2个条件的则是平年
return false;
}

/**
* 判断是否大月
* @param month
* @return
*/
static boolean judgeMonth(int month){
List<Integer> bigMonth=List.of(1,3,5,7,8,10,12);
if(bigMonth.contains(month)){
return true;
}
return false;
}
}

净净一隅

#2 Created at ... [Delete] [Delete and Lock User]

package com;

import tools.date.LocalDateFactory;

public class Application {
public static void main(String[] args){
try
{System.out.println(LocalDateFactory.fromInt(99991031));}
catch (IllegalArgumentException e){
e.printStackTrace();
}
}
}

Little虔

#3 Created at ... [Delete] [Delete and Lock User]

考虑得这么全面,看来这位大佬工作经验很丰富

🌙

#4 Created at ... [Delete] [Delete and Lock User]

第一次看到我也觉得考虑周到,

但是,这种代码真的很小白

想学习,建议点进 

LocalDate.of

方法,看看源码,看看官方是如何处理这些问题的

🌙

#5 Created at ... [Delete] [Delete and Lock User]

留个坑,我也可以没仔细看,后面在补上,因为,这里重点不是,这个是设计模式,工厂方法算是过去了,,,,


  • 1

Reply