【问题标题】:calendar methods日历方法
【发布时间】:2009-06-24 07:23:15
【问题描述】:

除了内置函数,我们可以使用任何简单的公式来计算以月份和年份为输入的月份的开始日期吗??

【问题讨论】:

标签: java date


【解决方案1】:

是的 - 使用 Calendar 对象:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2009)
cal.set(Calendar.MONTH, Calendar.JUNE) //0-based so that Calendar.JANUARY is 0
cal.set(Calendar.DAY_OF_MONTH, 1)

然后:

cal.get(Calendar.DAY_OF_WEEK); //is Calendar.MONDAY

所以你可以很容易地为此编写一个方法:

/** takes a 1-based month so that Jjanuary is 1 */
public int getDayAtStart(int year, int month) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year)
    cal.set(Calendar.MONTH, month - 1);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    return cal.get(Calendar.DAY_OF_WEEK); 
}

【讨论】:

    【解决方案2】:

    一如既往,我建议使用Joda Time。我敢说java.util.Calendar 可以解决这个问题,但我更喜欢尽可能使用 Joda Time 进行所有日期和时间计算。内置的 API 很糟糕。 Joda 确实让这变得非常容易。 (除非指定,LocalDate 假定为 ISOChronology - 我希望这就是您想要的,但如果需要,您可以指定不同的。)

    import org.joda.time.*;
    
    public class Test
    {
        // Just for the sake of a simple test program!
        public static void main(String[] args) throws Exception
        {
            // Prints 1 (Monday)
            System.out.println(getFirstDayOfMonth(2009, 6));
        }
    
        /** Returns 1 (Monday) to 7 (Sunday) */
        private static int getFirstDayOfMonth(int year, int month)
        {
            LocalDate date = new LocalDate(year, month, 1);
            return date.getDayOfWeek();
        }
    }
    

    或者,如果您只需要在一个地方执行此操作,您可以根据需要将其混入一行:

    int day = new LocalDate(year, month, 1).getDayOfWeek();
    

    很难想象它会比这简单得多:)

    【讨论】:

    • JSR 310 即将上架,学习 Joda 时间没有多大意义?
    • 当我看到它真正发布时我会相信它——当每个人都真正使用 Java 7 时。我不希望任何地方都会在它发布的那一刻跳到它.除了与同一个设计师,我希望它会足够相似,以至于现在花在学习 Joda Time 上的时间不会被浪费。
    • 看一看,感觉和JODA很不一样
    • 我敢打赌,它与 Joda 的关系比它与 Date/Calendar 的关系更近...而且无论如何,与此同时,我更多宁愿使用一个体面的 API 和适当的日期、时间、瞬间等的分离,而不是日历。在过去的一年里,我一直在很多日期/时间工作,我不会再回到日期/日历做任何事情......
    【解决方案3】:

    java.time

    java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

    另外,下面引用的是Home Page of Joda-Time的通知:

    请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

    使用现代 API java.time 的解决方案:

    import static java.lang.System.out;
    
    import java.time.DayOfWeek;
    import java.time.YearMonth;
    import java.time.format.DateTimeFormatter;
    import java.time.format.TextStyle;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            DayOfWeek dow = getFirstDayOfMonth(2021, 5);
            out.println(dow); // SATURDAY
    
            // As weekday number
            out.println(dow.getValue()); // 6
    
            // Some predefined styles
            out.println(dow.getDisplayName(TextStyle.FULL, Locale.ENGLISH)); // Saturday
            out.println(dow.getDisplayName(TextStyle.SHORT, Locale.ENGLISH)); // Sat
            out.println(dow.getDisplayName(TextStyle.NARROW, Locale.ENGLISH)); // S
    
            // Formatting using DateTimeFormatter
            out.println(DateTimeFormatter.ofPattern("EEEE", Locale.ENGLISH).format(dow)); // Saturday
            out.println(DateTimeFormatter.ofPattern("EEE", Locale.ENGLISH).format(dow)); // Sat
            out.println(DateTimeFormatter.ofPattern("EEEEE", Locale.ENGLISH).format(dow)); // S
        }
    
        private static DayOfWeek getFirstDayOfMonth(int year, int month) {
            return YearMonth.of(year, month)
                            .atDay(1)
                            .getDayOfWeek();
        }
    }
    

    ONLINE DEMO

    注意:如果您的要求是为特定时区找到相同的时区,请使用LocalDate#atStartOfDay(ZoneId),如下所示:

    import static java.lang.System.out;
    
    import java.time.DayOfWeek;
    import java.time.YearMonth;
    import java.time.ZoneId;
    
    public class Main {
        public static void main(String[] args) {
            DayOfWeek dow = getFirstDayOfMonth(2021, 5, ZoneId.of("America/Los_Angeles"));
            out.println(dow); // SATURDAY
        }
    
        private static DayOfWeek getFirstDayOfMonth(int year, int month, ZoneId zoneId) {
            return YearMonth.of(year, month)
                            .atDay(1)
                            .atStartOfDay(zoneId)
                            .getDayOfWeek();
        }
    }
    

    ONLINE DEMO

    Trail: Date Time了解更多关于java.timemodern Date-Time API*


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

      【解决方案4】:

      用给定的月份和年份、第 1 天和cal.get(Calendar.DAY_OF_WEEK) 构造一个日历 (cal)...抱歉,不要认为有任何内置函数只用于该任务

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        • 2018-03-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        相关资源
        最近更新 更多