`

计算给定日期的前一天(不使用jdk 日期函数)

阅读更多

题目已过期。

要求:

汇付的一笔试题,要求计算给定日期的前一天,日期格式"YYYYMMDD",不能使用Date、Calendar相关日期的操作方法

步骤:

1、先分割出给定日期的年、月、日,转成int类型

2、日期-1,分为1号和非1号

    1号特殊操作,月份-1,需判断是否闰年,天数为最大(特殊月

     月份-1,需判断是否是减成了0,是的话年-1,月12,日31(跨年

3、toString 年、月、日转String并补零

package net.leo.java.date;

/**
 * 要求计算给定日期的前一天 
 * 不使用java API中的Date和Calendar 
 * 日期格式如“20101202”
 * 
 * @title YesdayNoAPI
 * @description
 * @author cxh
 * @version
 * @create_date 2013-7-10
 * @copyright (c)
 */
public class YesdayNoAPI {

	// 2月天数
	private int MAXDAYS_FEBRUARY;

	private int year, month, day;

	public static void main(String[] args) {
		String todayStr = "00100101";
		System.out.println("today is:" + todayStr);
		YesdayNoAPI ins = new YesdayNoAPI();
		ins.getYesday(todayStr);
		System.out.println(ins.parseString());
	}
	
	/**
	 * 分割年月日
	 * 
	 * @description
	 * @author cxh
	 * @param todayStr
	 */
	private void split(String todayStr) {
		year = Integer.valueOf(todayStr.substring(0, 4));
		month = Integer.valueOf(todayStr.substring(4, 6));
		day = Integer.valueOf(todayStr.substring(6));
	}
	
	/**
	 * 获取前一天
	 * 
	 * @description
	 * @author cxh
	 * @param todayStr
	 */
	public void getYesday(String todayStr) {

		split(todayStr);

		// 天数-1
		if (day == 1) {
			decMonth();
		} else {
			day -= 1;
		}
	}

	/**
	 * 月-1 说明天数为1号
	 * 
	 * @description
	 * @author cxh
	 */
	private void decMonth() {
		switch (--month) {
		// 跨年
		case 0:
			--year;
			month = 12;
			day = 31;
			break;
		case 2:
			// 润平判断
			isLeapYear();
			day = MAXDAYS_FEBRUARY;
			break;
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
			day = 31;
			break;
		default:
			day = 30;
			break;
		}
	}

	/**
	 * 判断是否闰年 赋值2月天数
	 * 
	 * @description
	 * @author cxh
	 */
	private void isLeapYear() {
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
			MAXDAYS_FEBRUARY = 29;
		} else {
			MAXDAYS_FEBRUARY = 28;
		}
	}

	/**
	 * toString
	 * 
	 * @description
	 * @author cxh
	 * @return
	 */
	private String parseString() {
		String dayStr = "" + day;
		String monthStr = "" + month;
		String yearStr = "" + year;
		// 补0
		if (day < 10) {
			dayStr = "0" + day;
		}
		if (month < 10) {
			monthStr = "0" + month;
		}
		for (int i = yearStr.length(); i < 4; i++) {
			yearStr = "0" + yearStr;
		}

		return "yesday is:" + yearStr + monthStr + dayStr;

	}
}

 

结果:

情况1:遇到2月

today is:20100301

yesday is:20100228

情况2:遇到跨年

today is:20100101

yesday is:20091231

情况3:遇到跨世纪

today is:00100101

yesday is:00091231

 

分享到:
评论

相关推荐

    jdk_api函数大全

    这个"jdk_api函数大全"可能是一个文档集合,其中以中文形式详细解释了JDK API中的各个函数,旨在帮助中国开发者更方便地理解和使用Java API。通过这样的中文版文档,开发者可以更容易地学习和查阅API,避免语言障碍...

    jdk1.8函数式接口.md

    jdk1.8函数式接口.mdjdk1.8函数式接口.mdjdk1.8函数式接口.md

    JDK1.8【函数式接口】【定义与使用】【源码】

    JDK1.8【函数式接口】【定义与使用】【源码】 文章地址:https://blog.csdn.net/m0_37969197/article/details/124146253 * 函数式接口(类的定义与适应形式,只是一种类的定义形式,属于新增语法) * 包:java....

    JDK1.8中文文档 JDK1.8中文 jkd8中文文档 JDK中文版

    新API更加直观,易于使用,并提供了更好的日期和时间计算功能。 除此之外,JDK1.8还改进了`Map`接口,新增了`putIfAbsent()`, `remove()`, `replace()`等原子操作,以及`forEach()`方法,使得遍历和修改`Map`更加...

    jdk1.6 和jdk1.8

    对于不熟悉英文的开发者来说,中文版的JDK文档无疑是一个巨大的帮助,它能确保开发者准确理解API的用法,从而提高开发效率。 总的来说,从JDK 1.6到JDK 1.8,Java平台经历了许多重要的演进,这些变化旨在提高开发者...

    JDK资源包合集(JDK6+JDK7+JDK8)

    JDK8,又名Java SE 8(标准版8),是2014年发布的,其最大的变化就是引入了Lambda表达式,这是一种函数式编程的概念,使得编写简洁、高效的并发代码成为可能。此外,JDK8还引入了Stream API,用于处理集合数据,提供...

    JDK11安装包,JDK11安装包

    JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11...

    JDK1.8 + 使用说明

    1. **Lambda表达式**:JDK1.8引入了函数式编程的概念,允许开发者使用简洁的lambda表达式来表示匿名函数,提高了代码的可读性和可维护性。 2. **方法引用和构造器引用**:除了lambda表达式,还增加了方法引用和构造...

    JDK- jdk1.8.0-211.zip

    在接口中添加默认方法是JDK 8的一个重要特性,它允许在不破坏向后兼容性的情况下为接口添加新方法。默认方法通过在方法声明前加上`default`关键字实现,可以有实现代码,这样接口的实现类可以选择重写或者直接使用...

    jdk8帮助文档(jdk8_API)

    Java Development Kit (JDK) 8 是Java编程语言的一个重要版本,它引入了许多新特性、改进和优化,极大地提升了开发者的生产力。这个压缩包“jdk8_API”包含了JDK 8的官方帮助文档,它是开发者理解和使用JDK 8的重要...

    Oracle最后一个商用免费版本JDK1.8.202

    在此之前,企业可以免费下载和使用Oracle JDK进行商业开发和运行,但自该日期起,Oracle改变了其授权策略,开始对某些商业用途的JDK收取费用。 Oracle JDK 1.8,也被称为Java SE 8,是Java的一个重要版本,它引入了...

    jdk8免安装版

    1. **lambda表达式**:这是JDK8最显著的改变之一,它简化了处理函数式编程风格的代码。Lambda表达式允许我们将匿名函数作为方法参数传递,使得代码更简洁,可读性更强。例如,我们可以使用lambda表达式来实现...

    32位1.8版本的JDK

    《32位1.8版本JDK详解》 32位1.8版本的Java Development Kit(JDK)是Oracle公司推出的一个针对32位操作系统的...对于Java开发者来说,理解和掌握32位1.8版本JDK的特性和使用方法,是提升开发技能不可或缺的一部分。

    JDK1.6中文API函数库(4)

    JAVA的中文API,找了很久,喜欢JAVA的朋友可以参考下,一共4个压缩包

    jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档

    9. **并发改进**:JDK 8对`ForkJoinPool`和`CompletableFuture`进行了优化,提供了一种更有效的并行计算方式,有助于提升多核环境下的程序性能。 10. **类型推断增强**:编译器现在能更好地推断局部变量的类型,...

    JDK8文档 jdk-1.8.0_221 jdk-8u221 API文档

    这提供了另一种简化代码的方式,尤其是在使用函数式接口时。 4. **Stream API** Stream API是JDK8的一大亮点,它为处理集合数据提供了一种声明式的编程风格。通过一系列操作(如map、filter、reduce)可以实现对...

    jdk帮助文档(包含jdk8、jdk10)

    JDK 8 API文档是基于Java 8版本的,这是Java历史上一个重要的里程碑,引入了许多创新特性,例如lambda表达式、函数式接口、Stream API以及Date和Time API的改进。Lambda表达式使得代码更加简洁和可读,函数式接口为...

    JDK1.8手册,中文

    JDK 1.8引入了Lambda表达式,这是一种简洁的函数式编程语法,可以用于表示无状态、无副作用的函数。Lambda表达式允许将匿名函数作为方法参数传递,或者用作方法返回值。例如,`Runnable r = () -&gt; System.out....

    jdk1.8中文版

    6. **Date和Time API增强**:JDK 1.8对`java.time`包进行了彻底改造,引入了`LocalDate`、`LocalTime`、`LocalDateTime`等新类,提供了更强大、更易于使用的日期和时间API。 7. **Optional类**:`Optional`类是用来...

    windows64位jdk6、jdk7、jdk8安装包

    此外,JDK8还包含了新的日期和时间API(java.time包),取代了过时的java.util.Date和Calendar类,提供更强大且易于使用的日期处理功能。方法引用和默认方法也是JDK8的重要特性,增强了接口的功能。 在Windows 64位...

Global site tag (gtag.js) - Google Analytics