【问题标题】:How to get name of the first day of a month?如何获取一个月的第一天的名称?
【发布时间】:2012-01-25 02:39:14
【问题描述】:

我将如何获得每月的第一天?因此,对于今年 1 月,它将在周日返回。然后在 2 月,它将在周三返回。

【问题讨论】:

  • 创建日期,然后从中检索日期(格式)
  • 搜索,我的好人。 This SO Q&A 既是蹩脚的方式,也是 Joda Time 的方式。今天碰巧也问了。大量点击。
  • @RanRag 它就在右侧的“相关”大标题下方。
  • 哦,是的,抱歉,我不知道我为什么要写那条评论。我想我这一天写的代码太多了。

标签: java


【解决方案1】:

要获取当月的第一个日期,请使用java.util.Calendar。首先获取它的一个实例并将字段Calendar.DAY_OF_MONTH 设置为该月的第一个日期。由于任何一个月的第一天都是 1,所以这里可以使用 1 代替 cal.getActualMinimum(Calendar.DAY_OF_MONTH)

private Date getFirstDateOfCurrentMonth() {
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
  return cal.getTime();
}

【讨论】:

  • 请注意,如果日历对象已设置为过去的特定月份,您将需要 cal.getActualMinimum
【解决方案2】:

您可以创建一个 Calendar 任何您想要的日期,然后执行 set(Calendar.DAY_OF_MONTH, 1) 以获得一个月的第一天。

     Calendar cal = Calendar.getInstance();
     cal.set(Calendar.DATE, 25);
     cal.set(Calendar.MONTH, Calendar.JANUARY);
     cal.set(Calendar.YEAR, 2012);

     cal.set(Calendar.DAY_OF_MONTH, 1);
     Date firstDayOfMonth = cal.getTime();  

     DateFormat sdf = new SimpleDateFormat("EEEEEEEE");   
     System.out.println("First Day of Month: " + sdf.format(firstDayOfMonth));  

【讨论】:

    【解决方案3】:
    public int getFirstDay(){
        Calendar c=new GregorianCalendar();
        c.set(Calendar.DAY_OF_MONTH, 1);
        return c.get(Calendar.DAY_OF_WEEK);
    }
    

    从那里您可以查看 int 是否等于 Calendar.SUNDAY、Calendar.MONDAY 等。

    【讨论】:

      【解决方案4】:

      在 Java 8 中,您可以使用 TemporalAdjusters:

      这是一个例子:

      import java.time.DayOfWeek;
      import java.time.LocalDate;
      import java.time.temporal.TemporalAdjusters;
      
      /**
       * Dates in Java8
       *
       */
      public class App {
          public static void main(String[] args) {
              LocalDate localDate = LocalDate.now();
              System.out.println("Day of Month: " + localDate.getDayOfMonth());
              System.out.println("Month: " + localDate.getMonth());
              System.out.println("Year: " + localDate.getYear());
      
              System.out.printf("first day of Month: %s%n",
                      localDate.with(TemporalAdjusters.firstDayOfMonth()));
              System.out.printf("first Monday of Month: %s%n", localDate
                      .with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
              System.out.printf("last day of Month: %s%n",
                      localDate.with(TemporalAdjusters.lastDayOfMonth()));
              System.out.printf("first day of next Month: %s%n",
                      localDate.with(TemporalAdjusters.firstDayOfNextMonth()));
              System.out.printf("first day of next Year: %s%n",
                      localDate.with(TemporalAdjusters.firstDayOfNextYear()));
              System.out.printf("first day of Year: %s%n",
                      localDate.with(TemporalAdjusters.firstDayOfYear()));
      
              LocalDate tomorrow = localDate.plusDays(1);
              System.out.println("Day of Month: " + tomorrow.getDayOfMonth());
              System.out.println("Month: " + tomorrow.getMonth());
              System.out.println("Year: " + tomorrow.getYear());
          }
      
      }
      

      结果是:

      Day of Month: 16
      Month: MAY
      Year: 2014
      first day of Month: 2014-05-01
      first Monday of Month: 2014-05-05
      last day of Month: 2014-05-31
      first day of next Month: 2014-06-01
      first day of next Year: 2015-01-01
      first day of Year: 2014-01-01
      Last in Month Tuesday: 2014-05-27
      Day of Month: 17
      Month: MAY
      Year: 2014
      

      【讨论】:

      • 信息丰富,但您没有完全总结——问题要求输入日期。
      【解决方案5】:

      TemporalAdjuster

      在 java 8 中,您可以使用新的 LocalDateLocalTime API。

      要达到梦寐以求的结果,请尝试以下方法。它打印给定日期的名称。

      import java.time.*;
      import java.time.temporal.*;
      
      public class Main {
        public static void main(String[] args) {
          LocalDate l = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
          System.out.println(l.getDayOfWeek());
        }
      }
      

      解释:

      • now 为您提供当前日期。
      • 通过调用with,您可以传递TemporalAdjuster,这是修改时间对象的关键工具。
      • getDayOfWeek 获取星期字段,这是一个枚举 DayOfWeek。 这包括值的文本名称。

      TemporalAdjuster 有一个兄弟类,称为 TemporalAdjusters,其中包含有关调整的静态方法,就像您正在寻找的那样,firstDayOfMonth

      【讨论】:

      • TemporalAdjuster 调用需要 API 级别 26,请查看我的答案
      【解决方案6】:

      创建java.util.Datejava.util.Calendar对象,设置日期值并使用java.text.SimpleDateFormat类方法格式化。

       Calendar cal=Calendar.getInstance();
       cal.set(Calendar.DATE,1);
       cal.set(Calendar.MONTH,0);
       cal.set(Calendar.YEAR,2012);
      
       SimpleDateFormat sdf=new SimpleDateFormat("EEEE");
       System.out.println(sdf.format(cal.getTime()));
      

      【讨论】:

        【解决方案7】:

        java.time

        从 Java 8 开始,我们还可以使用 YearMonth 类,它允许我们创建具有指定日期(第一天,最后一天)的 LocalDate 对象。然后我们可以简单地将这些日期转换为DayOfWeekEnum (Tutorial) 并读取其name 属性。

        YearMonth ym = YearMonth.of(2012, 1);
        
        String firstDay = ym.atDay(1).getDayOfWeek().name();
        String lastDay = ym.atEndOfMonth().getDayOfWeek().name();
        
        System.out.println(firstDay);
        System.out.println(lastDay);
        

        结果:

        SUNDAY
        TUESDAY
        

        【讨论】:

          【解决方案8】:

          java.time,软编码

          Pshemo 的 Answer 既好又聪明,但硬编码为英文。让我们尝试一下它是否允许本地化。

          ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Time zone is crucial to determining a date.
          YearMonth yearMonth = YearMonth.now( zoneId );
          LocalDate firstOfMonth = yearMonth.atDay( 1 );
          

          格式化程序

          生成该LocalDate 的文本表示。我们指定一个所需的Locale,在本例中为CANADA_FRENCH。如果省略,则隐式应用 JVM 当前的默认语言环境;最好指定明确的语言环境。

          DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEEE" ).withZone( zoneId ).withLocale( Locale.CANADA_FRENCH );  // Exactly four 'E' letters means full form. http://docs.oracle.com/javase/8/docs/api/java/time/format/TextStyle.html#FULL
          String output = formatter.format( firstOfMonth );
          

          转储到控制台。

          System.out.println( "output: " + output );
          

          运行时。

          萨米迪

          DayOfWeek枚举

          另一种方法是使用DayOfWeek 枚举。此枚举包含一个getDisplayName 方法,您可以在其中指定text style(全名与缩写)和Locale

          DayOfWeek dayOfWeek = firstOfMonth.getDayOfWeek() ;
          String output = dayOfWeek.getDisplayName( TextStyle.FULL_STANDALONE  , Locale.CANADA_FRENCH ) ;
          

          【讨论】:

            【解决方案9】:

            简单而棘手的答案

                val calendar = Date()    
                val sdf = SimpleDateFormat("yyyy-MM-01 00:00:00", Locale.getDefault())
                var result = sdf.format(calendar)
            

            yyyy-MM-01 -> dd 改为 01

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-14
              • 1970-01-01
              • 1970-01-01
              • 2011-03-31
              • 2022-09-27
              相关资源
              最近更新 更多