Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找会计年度特定日期所属的季度_Java - Fatal编程技术网

Java 查找会计年度特定日期所属的季度

Java 查找会计年度特定日期所属的季度,java,Java,我正在使用Java1.7,如何找到一个会计年度中某个特定日期所属的季度,该季度可以从1月1日到12月1日开始,还需要该季度的开始日期和结束日期 i、 e假设2017年4月1日至2018年3月31日,2017年6月26日属于第1季度,季度开始日期为2017年10月1日,结束日期为2017年12月31日。等使用日历: Calendar cal = Calendar.getInstance(); cal.setTime(myDate); 季度: int q = cal.get(Calendar.MO

我正在使用Java1.7,如何找到一个会计年度中某个特定日期所属的季度,该季度可以从1月1日到12月1日开始,还需要该季度的开始日期和结束日期

i、 e假设2017年4月1日至2018年3月31日,2017年6月26日属于第1季度,季度开始日期为2017年10月1日,结束日期为2017年12月31日。等使用日历:

Calendar cal = Calendar.getInstance();
cal.setTime(myDate);
季度:

int q = cal.get(Calendar.MONTH)%3;
System.out.println("Quarter: Q" + (q + 1));
季度初:

cal.set(Calendar.MONTH, 3*q);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date start = cal.getTime();
System.out.println("Start: " + start);
cal.add(Calendar.MONTH, 3);
cal.add(Calendar.DATE, -1);
Date end = cal.getTime();
System.out.println("End: " + end);
季度末:

cal.set(Calendar.MONTH, 3*q);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date start = cal.getTime();
System.out.println("Start: " + start);
cal.add(Calendar.MONTH, 3);
cal.add(Calendar.DATE, -1);
Date end = cal.getTime();
System.out.println("End: " + end);

在Java 7中,您可以执行以下操作:

public static void main(String[] args) {
    // Dates are DD/MM/YYYY
    String date_string = "26/06/2017";

    String quarter_start_string = "01/04/2017";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date in_date = sdf.parse(date_string);
    Date qstart = sdf.parse(quarter_start_string);
    boolean found = false; 
    int quarter = 1;
    Calendar in_date_cal = GregorianCalendar.getInstance();
    in_date_cal.setTime(in_date);

    Calendar fq_start = GregorianCalendar.getInstance();
    fq_start.setTime(qstart);
    Calendar fq_end = GregorianCalendar.getInstance();
    fq_end.setTime(qstart);
    fq_end.add(GregorianCalendar.MONTH, 3 );
    while (!found) { 
        if (in_date_cal.hashCode() >= fq_start.hashCode() && 
                in_date_cal.hashCode() <= fq_end.hashCode()) {
            break; 
        }
        fq_start.add(GregorianCalendar.MONTH, 3 );
        fq_end.add(GregorianCalendar.MONTH, 3 );
        quarter++; 
    }

    System.out.println("Quarter# is " + quarter);
    System.out.println("Quarter Start is " + sdf.format(fq_start.getTime()));
    System.out.println("Quarter End is " + sdf.format(fq_end.getTime()));
}
java.time 现代java数据和时间API java.time为您提供了所需的大部分内容。只是它死了,不知道你的财政年度。您请求的季度比java.time支持的ISO日历系统中使用的季度少一个季度。所以我的技巧是从日期中减去一个季度,然后查询java.time关于季度和年份的信息。这将为您提供所需的数字

在代码中,尝试不同的日期:

    LocalDate[] exampleDates = {
            LocalDate.of(2020, Month.JANUARY, 1),
            LocalDate.of(2020, Month.JUNE, 30),
            LocalDate.of(2020, Month.AUGUST, 22),
            LocalDate.of(2020, Month.OCTOBER, 1),
            LocalDate.of(2021, Month.MARCH, 31),
    };
    
    for (LocalDate date : exampleDates) {
        LocalDate syntheticQuarterDate = date.minus(1, IsoFields.QUARTER_YEARS);
        
        // Get quarter number and year as int
        int quarter = syntheticQuarterDate.get(IsoFields.QUARTER_OF_YEAR);
        int year = syntheticQuarterDate.getYear();
        System.out.format("Quarter: %d; year: %d%n", quarter, year);
    }
输出为:

假设您想要一个类似Q412019的字符串,而不是数字。在这种情况下,最好使用格式化程序:

    DateTimeFormatter quarterFormatter
            = DateTimeFormatter.ofPattern("QQQuuuu", Locale.ENGLISH);
现在,对于每个日期,请执行以下操作:

        // Print a string like "Q42019"
        String quarterString = syntheticQuarterDate.format(quarterFormatter);
        System.out.println(quarterString);
使用与之前相同的日期进行输出:

问题:这对Java7有效吗? time在Java7上运行良好。它至少需要Java6

在Java8和更高版本以及API级别为26的较新Android设备上,内置了现代API。 在非Android Java 6和7中,获得了Three Ten Backport,即JSR 310的现代类Three Ten的Backport;请参阅底部的链接。 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类。 链接 解释如何使用java.time。 ,其中首次描述了java.time。 ,java.time的后端口到JSR-310的Java6和Java7。 ,Android版Three Ten Backport ,解释得非常透彻。 我的回答也是在
将月份M与日期分开;如果M小于F/Y的起始月,则M加12;从M中减去F/Y起始月,得到FY MFY的月份;将MFY除以4,然后在商中加1以获得季度Q。感谢您的解决方案,但除了季度之外,我们还需要该特定季度的开始和结束日期。提示:搜索“半开放”和YearMonth。这已经在Stack Overflow上讨论过很多次了。因此,如果财政年度不是4月1日,只需将第一次提到的神奇数字3更改为另一个数字,而不是将另外两次提到的数字更改为另一个数字?理想情况下,这应该是一个方法参数。无幻数3是一个季度3个月的长度。如果财政年度没有从4月1日开始,只需更改季度开始字符串。啊,是的,我错过了那个。不过你的观点很好理解-3应该是季度月份或类似的。这些麻烦的旧遗留日期时间类被java 8及更高版本中的java.time类所取代。@BasilBourque如果你不喜欢Calendar类,写你自己的回答Maurice Perry,我认为
Q42019
Q12020
Q22020
Q32020
Q42020