java从ZoneDateTime获取月份的哪一天

java从ZoneDateTime获取月份的哪一天,java,zoneddatetime,Java,Zoneddatetime,我想从给定的ZoneDateTime中找出一个月的哪一天。 我知道今天是星期四,想知道一个月的哪个星期四? 例如: 2021-06-10T13:30:30+03:00等于2。星期四 2021-06-17T13:30:30+03:00是3。星期四 2021-06-24T13:30:30+03:00是上周四 等等 private static int getWhicDayOfMonth(ZonedDateTime date) { } 最简单的方法是什么?从一个月中第一次出现的一周中的

我想从给定的
ZoneDateTime
中找出一个月的哪一天。 我知道今天是星期四,想知道一个月的哪个星期四? 例如:

  • 2021-06-10T13:30:30+03:00等于2。星期四

  • 2021-06-17T13:30:30+03:00是3。星期四

  • 2021-06-24T13:30:30+03:00是上周四

  • 等等

    private static int getWhicDayOfMonth(ZonedDateTime date) {
    
    }
    

最简单的方法是什么?

从一个月中第一次出现的一周中的某一天开始,以7天的步长值循环一个月中的所有天,并不断递增计数器,直到匹配给定的日期

演示:

import java.time.DayOfWeek;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(whichDowOfTheMonth("2021-06-10T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-17T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-24T13:30:30+03:00"));
    }

    static int whichDowOfTheMonth(String strDateTime) {
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
        DayOfWeek dow = zdt.getDayOfWeek();

        ZonedDateTime zdtFirstDowOfMonth = zdt.with(TemporalAdjusters.firstInMonth(dow));
        ZonedDateTime zdtLastDayOfMonth = zdt.with(TemporalAdjusters.lastDayOfMonth());

        int count = 1;
        for (ZonedDateTime date = zdtFirstDowOfMonth; !date.isAfter(zdtLastDayOfMonth); date = date.plusDays(7)) {
            if (date.equals(zdt))
                break;
            count++;
        }
        return count;
    }
}
2
3
4
输出:

import java.time.DayOfWeek;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(whichDowOfTheMonth("2021-06-10T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-17T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-24T13:30:30+03:00"));
    }

    static int whichDowOfTheMonth(String strDateTime) {
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
        DayOfWeek dow = zdt.getDayOfWeek();

        ZonedDateTime zdtFirstDowOfMonth = zdt.with(TemporalAdjusters.firstInMonth(dow));
        ZonedDateTime zdtLastDayOfMonth = zdt.with(TemporalAdjusters.lastDayOfMonth());

        int count = 1;
        for (ZonedDateTime date = zdtFirstDowOfMonth; !date.isAfter(zdtLastDayOfMonth); date = date.plusDays(7)) {
            if (date.equals(zdt))
                break;
            count++;
        }
        return count;
    }
}
2
3
4


了解有关现代日期时间API的更多信息,从一个月中第一次出现的一周中的某一天开始,以7天的步长值循环一个月中的所有天,并不断递增计数器,直到匹配给定的日期

 private static int getWhicDayOfMonth(ZonedDateTime date) {
    return (date.getDayOfMonth() - 1) / 7 + 1;
 }
演示:

import java.time.DayOfWeek;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(whichDowOfTheMonth("2021-06-10T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-17T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-24T13:30:30+03:00"));
    }

    static int whichDowOfTheMonth(String strDateTime) {
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
        DayOfWeek dow = zdt.getDayOfWeek();

        ZonedDateTime zdtFirstDowOfMonth = zdt.with(TemporalAdjusters.firstInMonth(dow));
        ZonedDateTime zdtLastDayOfMonth = zdt.with(TemporalAdjusters.lastDayOfMonth());

        int count = 1;
        for (ZonedDateTime date = zdtFirstDowOfMonth; !date.isAfter(zdtLastDayOfMonth); date = date.plusDays(7)) {
            if (date.equals(zdt))
                break;
            count++;
        }
        return count;
    }
}
2
3
4
输出:

import java.time.DayOfWeek;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(whichDowOfTheMonth("2021-06-10T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-17T13:30:30+03:00"));
        System.out.println(whichDowOfTheMonth("2021-06-24T13:30:30+03:00"));
    }

    static int whichDowOfTheMonth(String strDateTime) {
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
        DayOfWeek dow = zdt.getDayOfWeek();

        ZonedDateTime zdtFirstDowOfMonth = zdt.with(TemporalAdjusters.firstInMonth(dow));
        ZonedDateTime zdtLastDayOfMonth = zdt.with(TemporalAdjusters.lastDayOfMonth());

        int count = 1;
        for (ZonedDateTime date = zdtFirstDowOfMonth; !date.isAfter(zdtLastDayOfMonth); date = date.plusDays(7)) {
            if (date.equals(zdt))
                break;
            count++;
        }
        return count;
    }
}
2
3
4

了解有关现代日期时间API的更多信息

 private static int getWhicDayOfMonth(ZonedDateTime date) {
    return (date.getDayOfMonth() - 1) / 7 + 1;
 }
在您的示例中:

10 -> 2
17 -> 3
24 -> 4
31 (in some months) -> 5
或者简化为
date.getDayOfMonth()+6)/7
——但我倾向于认为这更容易让人困惑

在您的示例中:

10 -> 2
17 -> 3
24 -> 4
31 (in some months) -> 5

或者简化为
date.getDayOfMonth()+6)/7
——但我倾向于发现这更让人困惑,阅读时基本上与@ArvindKumarAvinash提供的答案相同,但循环有点不同:

/**
*
*计算当月的哪个工作日
*在{@link ZonedDateTime}中传递。
*

* *@param zonedDateTime计算其“月的工作日”的日期时间 *@返回月的工作日 */ 私有静态int getWeekdayOfMonth(ZonedDateTime ZonedDateTime){ //从传递的日期时间中提取您感兴趣的值 int dayOfMonth=zonedDateTime.getDayOfMonth(); DayOfWeek DayOfWeek=zonedDateTime.getDayOfWeek(); //提供一个计数器变量 int weekdayCount=0; //然后迭代到每月的某一天,并比较每周的几天
对于(int d=1;d基本上与@ArvindKumarAvinash提供的答案中的方法相同,但循环有点不同:

/**
*
*计算当月的哪个工作日
*在{@link ZonedDateTime}中传递。
*

* *@param zonedDateTime计算其“月的工作日”的日期时间 *@返回月的工作日 */ 私有静态int getWeekdayOfMonth(ZonedDateTime ZonedDateTime){ //从传递的日期时间中提取您感兴趣的值 int dayOfMonth=zonedDateTime.getDayOfMonth(); DayOfWeek DayOfWeek=zonedDateTime.getDayOfWeek(); //提供一个计数器变量 int weekdayCount=0; //然后迭代到每月的某一天,并比较每周的几天
例如(int d=1;d月日表示一个月的第一、第二或第二十八天……你是在要求一个月的工作日吗?获取月日的最简单方法是
返回日期。getDayOfMonth()
…我不是这个意思。月日表示:我知道那一天是星期四,但我想知道该月的哪个星期四(第一、第二..还是最后一个)。因为偏执论是错误的,所以重新发布:我假设整数除以7可以解决这个问题?
(dayOfMonth-1)//7+1
-如果是1,则是第一周,依此类推。当然是“最后一周”需要更多的努力,但既然你要求
int
,我想你可以用另一种方法来解决。@thinkgruen的答案是最简单的,应该是可以接受的答案。一个月内的
1-7
天总是他们各自的星期一的第一天,
8-14
总是第二天,依此类推。这并不重要星期几是一个月的第一天,今天是星期几并不重要。你不需要计算任何东西。这是一个简单的数学计算。月日是指一个月的第一、第二或第28天……你是在要求像月的工作日这样的东西吗?获取月日的最简单方法是
return date.getDayOfMon()
…我不是故意的。月日的意思是:我知道那天是星期四,但我想知道那个月的哪个星期四(第一、第二……还是最后一个)。因为妄想症是错误的,所以重新发布:我假设整数除以7可以解决这个问题?
(月日-1)//7+1
-如果是1,这是第一周,依此类推。当然是“最后一周”需要更多的努力,但既然你要求
int
,我想你可以用另一种方法来解决。@thinkgruen的答案是最简单的,应该是可以接受的答案。一个月内的
1-7
天总是他们各自的星期一的第一天,
8-14
总是第二天,依此类推。这并不重要星期几是一个月的第一天,今天是星期几并不重要。你不需要计算任何东西。这是一个简单的数学计算。此外,如果你想知道某件事是否“最后”,你需要检查离月底的时间是否少于7天。很好的方法…+1表示简短。另外,如果你想查看某物是否“最后”,你需要检查离月底的时间是否少于7天。很好的方法…+1表示简短