日历添加行为

Posted

技术标签:

【中文标题】日历添加行为【英文标题】:Calendar add behaviour 【发布时间】:2013-06-11 14:34:22 【问题描述】:

想要获取下周的第一天(下周一),但调用 getTime() 会更改日历对象。

请告诉我获取下周第一天的正确方法。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Main 
    public static void main(String[] args) 
        
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            final Calendar cal = new GregorianCalendar( 2013, 5, 6 );
            cal.setFirstDayOfWeek( Calendar.MONDAY );
            //System.out.println( sdf.format( cal.getTime() ) );
            cal.set( Calendar.DAY_OF_WEEK,  Calendar.MONDAY );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-06
            cal.add( Calendar.WEEK_OF_YEAR, 1 );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-13
        
        
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            final Calendar cal = new GregorianCalendar( 2013, 5, 6 );
            cal.setFirstDayOfWeek( Calendar.MONDAY );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-06
            cal.set( Calendar.DAY_OF_WEEK,  Calendar.MONDAY );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-03
            cal.add( Calendar.WEEK_OF_YEAR, 1 );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-10
        
    

【问题讨论】:

【参考方案1】:

这是一个很好的例子...

Calendar 不好处理。你的问题是日期的评估。

Calendar 的日期是新评估的,如果您调用例如getTime()add()

在第二个(正确的)示例中,您在设置一周的第一天后调用getTime(),并将日历设置为2013-06-06。之后,您更改星期几并设置新日历(通过getTime())。因此现在设置为星期一。

在第一个示例中,您将Calendar 设置为日期并设置星期几。这会导致无效日期(暂时)。 2013-06-06 是星期四,而您设置为星期一。现在哪一天是正确的星期几? Calendar 实现现在选择星期四。

这也是 Javadoc 中的 well documented。该部分名为日历字段分辨率

【讨论】:

以上是关于日历添加行为的主要内容,如果未能解决你的问题,请参考以下文章

行分隔符上的标签 - Swift Tableview - 每小时日历

选择日历以添加 iOS 事件

Excel中进行添加日历控件的两种方法

使用 EventKit 添加事件和日历

向 Google 日历移动应用添加 ics 提要?

在 android 中以编程方式使用谷歌日历添加同步事件