【问题标题】:How to get the total number of weeks in the current year?如何获得当年的总周数?
【发布时间】:2017-09-08 05:17:51
【问题描述】:

我在 stackoverflow 上得到下面的代码,它返回当年的总周数,但它是硬编码的,在 2014 年和 2016 年不起作用。我如何动态地获得当年的总周数???

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2015);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);

int ordinalDay = cal.get(Calendar.DAY_OF_YEAR);
int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; // Sunday = 0
int numberOfWeeks = (ordinalDay - weekDay + 10) / 7;
System.out.println(numberOfWeeks);

我喜欢这个只是检查它是当前方法吗?

     Calendar cal = Calendar.getInstance();
     int year = cal.get(Calendar.YEAR);
     cal.set(Calendar.YEAR, year);
     cal.set(Calendar.MONTH, Calendar.DECEMBER);
     cal.set(Calendar.DAY_OF_MONTH, 31);

     int ordinalDay = cal.get(Calendar.DAY_OF_YEAR);
     int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; // Sunday = 0
     int numberOfWeeks = (ordinalDay - weekDay + 10) / 7;
     System.out.println(numberOfWeeks);

【问题讨论】:

  • 怎么样???我如何以编程方式自动检测一年的总人数
  • 这段代码说一个月中的天是 31,但大多数 mnths 有 30 天,二月有 28 天
  • 我很喜欢你所说的,只是检查上面的方法是否正确??

标签: java android android-calendar


【解决方案1】:

使用下面的代码

Calendar mCalendar = new GregorianCalendar(); 
mCalendar.set(Calendar.YEAR, 2014); // Set only year 
mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change
mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change
int totalWeeks = mCalendar.get(Calendar.WEEK_OF_YEAR);

不要在意一个月的 30、28 和 29 天。一年的最后一天(任何一年)总是 12 月 31 日。所以你需要设置那一天。而mCalendar.get(Calendar.WEEK_OF_YEAR) 将返回当年的总周数。


动态方式更新

private int getTotalWeeksInYear(int year) {
        Calendar mCalendar = new GregorianCalendar(); 
        mCalendar.set(Calendar.YEAR, year); // Set only year 
        mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change
        mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change
        return mCalendar.get(Calendar.WEEK_OF_YEAR);
    }

    // Call as
    int totalWeeks = getTotalWeeksInYear(2014);

在上面的代码中寻找错误。到时候你可以使用下面运行良好的代码

private int getTotalWeeksInYear(int year) {
        Calendar mCalendar = new GregorianCalendar(TimeZone.getDefault()); 
        mCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        // Workaround
        mCalendar.set(year, 
                Calendar.DECEMBER, 
                31);
        int totalDaysInYear = mCalendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(totalDaysInYear);
        int totalWeeks = totalDaysInYear / 7; 
        return totalWeeks;
    }

【讨论】:

  • @user2706686 ...所以使用变量?你知道怎么做吗?
  • 您可以将其设为变量。这很容易将该代码转换为动态方式..你有什么问题?
  • 我想返回一年中的总周数,我猜是一年中的 52 周或其他什么
  • 我很喜欢你所说的,只是检查上面的方法是否正确??
  • thnx for codeactully 我创建一个应用程序不知道明年有多少周所以我可以相信你的代码是完美的吗?
【解决方案2】:

在这个方法中只使用当前年份:

int year = Calendar.getInstance().get(Calendar.YEAR);
cal.set(Calendar.YEAR, year);

其余部分与您的示例相同。

【讨论】:

  • 但它说月份是 31?某个月是 30 或 28 天
  • 我写的不是这一行 cal.set(Calendar.YEAR, 2015);
  • 1.) 31 是十二月的天数... 2.)cal.set(Calendar.YEAR, year);
  • 我很喜欢你所说的,只是检查上面的方法是否正确??
【解决方案3】:

我有一个 DatePickerFragment,它的 onDateSet 函数

public void onDateSet(DatePicker view, int year, int month, int day) {
    ((Main) getActivity()).setWeek(year, month, day);
} 

仅返回年、月和日。所以我必须执行以下操作才能获得一周。

public void getWeek(int year, int month, int day){

        final Calendar c = Calendar.getInstance();
        c.set(year, month, day);
        int week = c.get(Calendar.WEEK_OF_YEAR);            

}

【讨论】:

    【解决方案4】:

    你可以使用类似的东西

    private Calendar getCalendar(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance(Locale.GERMAN);
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.set(year, month, day);
        return calendar;
    }
    
    private int getTotalWeeksInYear(int year) {
        return getCalendar(year, Calendar.DECEMBER, 31).get(Calendar.WEEK_OF_YEAR); 
    }
    

    请记住,一年中的一周的定义取决于当地情况。这意味着在不同的语言环境中,get(Calendar.WEEK_OF_YEAR) 的返回值会有所不同。 例如,在根据 DIN 1355-1 / ISO 8601 的 Locale.GERMAN 中,一年中的第一周是在新的一年中包含 4 天或更多天的一周。对于 Locale.US,一年中的第一周是 1 月 1 日所属的那一周。

    【讨论】:

      【解决方案5】:

      最快的方法是: 根据您来自哪里正确设置日历非常重要,因为周数是根据给定标准确定的。例如,在 Europ 中是 ISO 8061。这意味着一年中的第 1 周从 01.01.RRRR 开始是星期四或更晚,并且一周从星期一开始。

      GregorianCalendar gregorianCalendar = new GregorianCalendar(year,12,31);
      gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY); // week beginn from Monday
      gregorianCalendar.setMinimalDaysInFirstWeek(4); // 1week mininum from Thursday
      int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR);
      

      【讨论】:

        【解决方案6】:

        为什么不使用CalendargetActualMaximum 属性?

        private int getWeeksCount(final int year, final Locale locale)
        {
            Calendar calendar = Calendar.getInstance(locale);
            calendar.set(Calendar.YEAR, year);
        
            int totalWeekNumber = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR);
            return totalWeekNumber;
        }
        

        【讨论】:

          【解决方案7】:

          您可以使用Calendar.getActualMaximum(int)方法获取当年的总周数如下:

          int totalNumberOfWeeks = Calendar.getInstance().getActualMaximum(Calendar.WEEK_OF_YEAR);
          

          简单。

          【讨论】:

            猜你喜欢
            • 2020-01-22
            • 2021-12-13
            • 2015-11-14
            • 2021-07-22
            • 1970-01-01
            • 1970-01-01
            • 2022-10-04
            • 2020-12-17
            • 1970-01-01
            相关资源
            最近更新 更多