`
luhantu
  • 浏览: 203494 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中Calendar的坑

    博客分类:
  • Java
阅读更多
package com.dev.tool.log.service;

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * Created by kenny.dong on 2018/4/2.
 */
public class CalendarTest {

    /**
     * Calendar.getTime 方法是返回自1970-01-01 00:00:00 UTC(Epoch Time)的毫秒数,然后转化为Date类型。
     * 现在有一个case是:
     * 当前时间是20180329,现在有一个year=2018,month=2的年份过来,想format为yyyyMM格式
     * 如果你把年份和月份直接给到Calendar,问题就出来了
     * @throws InterruptedException
     */
    @Test
    public void calendarGetTime() throws InterruptedException, ParseException {
        int year = 2018;
        int month = 2;
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(format.parse("20180331"));
        calendar.set(Calendar.YEAR,year);
        calendar.set(Calendar.MONTH,month-1);
        String DateStr = format.format(calendar.getTime());
        System.out.println(DateStr);
        /**
         * 输出结果为20180301,我们期望的输出结果应该为输出结果为20180201,怎么就整整多了一个月?
         * 这个是因为Calendar的set方法,仅仅是把月份的值给更改了。但是Calendar最终是根据毫秒数来推算
         * 它所代表的时间的,那么他的DAY天数没有变,因为201802正好没有29号,那么Calendar就等于是2月28日
         * 然后加1天,那么就是20180301了!如果当前时间是20180331,那么输出就是20180303啦!
         *所以使用Calendar,可以  calendar.set(Calendar.DAY_OF_MONTH,1);设为月初比较保险。
         */
    }

    @Test
    public void calendarGetTimeOk() throws InterruptedException, ParseException {
        int year = 2018;
        int month = 2;
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(format.parse("20180331"));
        calendar.set(Calendar.YEAR,year);
        calendar.set(Calendar.MONTH,month-1);
        calendar.set(Calendar.DAY_OF_MONTH,1);//设为月初
        String DateStr = format.format(calendar.getTime());
        System.out.println(DateStr);
    }
}

 

0
0
分享到:
评论

相关推荐

    Java 之 Date 和 Calendar 实例

    在早期版本的Java中,`Date`类常常被用来处理日期和时间,但由于其API设计不够理想,后来在Java 1.1中引入了`Calendar`类来替代它。 `Date`类的主要方法包括: 1. `Date()`:构造一个表示当前日期和时间的`Date`...

    java 中Calendar日期格式的转换

    本文将深入探讨如何利用`Calendar`类进行日期格式的转换,以及如何在Java中有效地处理日期和时间。 ### 1. `Calendar`类的基本介绍 `Calendar`类是Java平台的一部分,位于`java.util`包中。它代表特定时刻的时间值...

    java的calendar具体用法

    ### Java中的Calendar类详解 #### 一、引言 在Java中处理日期和时间非常常见,而`java.util.Calendar`类则是进行此类操作的核心工具之一。`Calendar`类提供了一系列的功能来帮助开发者处理复杂的日期计算问题,...

    JAVA LunarCalendar返回农历(阴历)日期 JAR包 有包括详细DOC文档

    LunarCalendar返回农历(阴历)日期的JAR包 根据指定日期计算对应农历日期(这个计算方法是网上找的,最初的作者是谁已经无法考证了,感谢网络资源吧!),本人封装成好用的JAR包后发不出来,供大家免费下载! ...

    Java SE程序 Calendar类

    Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类Java SE程序 Calendar类...

    JavaCalendar_JAVA源码_

    这个源码分析将深入探讨Java中日期和时间的管理,以及如何利用`Calendar`类进行相关的操作。 首先,`Calendar`类是抽象的,不能直接实例化,通常我们通过`Calendar.getInstance()`来获取一个`Calendar`对象,它会...

    Java中Calendar类.pdf

    Java中的`Calendar`类是处理日期和时间的核心类,它是一个抽象类,提供了一系列方法用于在特定瞬间与一组日历字段之间进行转换和操作。自JDK 1.1起,`Calendar`类就被推荐用来处理日期和时间,因为它的功能比`Date`...

    java_Calendar控件

    Java中的`Calendar`类是处理日期和时间的核心组件,它是一个抽象类,提供了对日期和时间的全面操作。在Java编程中,`Calendar`控件是用于创建、修改和查询日期的重要工具。这个控件的功能非常强大,可以满足各种复杂...

    java中Calendar类用法实例详解

    Java 中 Calendar 类用法实例详解 Java 中的 Calendar 类是一个非常重要的类,它提供了许多有用的方法和字段来处理日期和时间相关的操作。下面我们将详细介绍 Java 中 Calendar 类的用法实例。 首先,Calendar 类...

    java中时间类Date和Calendar的使用

    Java中的时间类`Date`和`Calendar`是处理日期和时间的核心组件,它们在Java编程中扮演着重要的角色。在Java中,`Date`类主要用来表示特定的瞬间,精确到毫秒。而`Calendar`类则是一个抽象类,提供了比`Date`更灵活的...

    java中Calendar类制作日历

    在Java中,`Calendar`类定义了一周的每一天,其中`Calendar.SUNDAY`的值为1,表示星期日;`Calendar.MONDAY`的值为2,表示星期一,以此类推。 #### 打印日历 在掌握了月份的第一天是一周中的哪一天之后,我们就...

    Java中用Calendar类计算周和周的起始日期

    在 Java 中,Calendar 类提供了计算周和周的起始日期的方法。 首先,需要了解 Calendar 类的 setFirstDayOfWeek() 方法,该方法用于设置一周的第一天。在 GregorianCalendar 中,默认的一周从星期日开始,但是在...

    JAVA Calendar方法详解.doc

    在Java编程语言中,`Calendar`类是一个核心的日期和时间API,它用于处理各种日历系统,而不仅仅是常见的格里高利历(Gregorian Calendar)。`Calendar`是一个抽象类,这意味着它不能直接被实例化,但是提供了`...

    JAVA Calendar,Date类详解

    在Java编程语言中,`Calendar`和`Date`类是处理日期和时间的核心组件。这两个类在处理日期、时间计算以及格式化等任务时扮演着关键角色。理解并熟练运用它们,对于提升Java开发能力至关重要。 `Date`类是Java早期...

    基于java的Calendar万年历.zip

    首先,我们要了解Java中的日期时间API。在Java 8之前,主要使用的是java.util.Calendar和java.util.Date这两个类。Calendar是抽象类,提供了日期和时间的抽象表示,而Date则代表了一个具体的时刻。Calendar类提供了...

    基于Java的Calendar万年历.zip

    在Java编程语言中,`Calendar`类是用于处理日期和时间的核心类之一。这个`基于Java的Calendar万年历.zip`文件很可能包含了一个示例项目,演示如何利用`Calendar`类构建一个显示从公元前到公元后数千年日期的万年历。...

    java日历控件Calendar 多种类型

    在Java中,Calendar是抽象类,通常通过Calendar.getInstance()获取其子类实例,如GregorianCalendar,这是默认的日历实现,基于公历。 在Java中,日历控件通常用于用户界面中,让用户能够选择日期。然而,Java标准...

    基于java的开发源码-Calendar万年历.zip

    基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的开发源码-Calendar万年历.zip 基于java的...

    Java基础之Date和Calendar类的使用方法

    Java中的Date和Calendar类是处理日期和时间的核心组件。Date类主要用于表示特定的瞬间,精确到毫秒。在早期版本的Java中,Date类的设计受到批评,因为它的API不直观且容易导致错误。为了解决这些问题,大部分日期和...

    JAVA_Calendar写的万年历

    在Java编程语言中,`Calendar`类是日期和时间的核心类,它提供了处理日期和时间的强大功能。在本项目“JAVA_Calendar写的万年历”中,开发者利用`Calendar`类构建了一个能够显示从公元1年到公元9999年的完整万年历的...

Global site tag (gtag.js) - Google Analytics