簡體   English   中英

前一年的同一天(前一年,同一周和星期幾)

[英]Same day prevous year (previous year, same week and day of week)

我想檢索前一年的同一天。

例如,今天是2019-03-30 ,即 2019 年,第 26 周(一年中的一周),第 7 天(一周中的某天)。

我需要構造LocalDate ,它是 2018 年,第 26 周(一年中的一周),第 7 天(一周中的某天)。

我無法從java.time包中找到可以像這樣構建LocalDate包。

似乎您希望上一年的日期與給定日期具有相同的年份和星期幾。 下面的代碼給你那個結果。

LocalDate currentLocalDate = LocalDate.now();
int dayOfWeek = currentLocalDate.getDayOfWeek().getValue();
int weekOfYear = currentLocalDate.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
LocalDate resultLocalDate = currentLocalDate
    .minusYears(1)
    .with(ChronoField.ALIGNED_WEEK_OF_YEAR, weekOfYear)
    .with(ChronoField.DAY_OF_WEEK, dayOfWeek);

完整示例(實時復制):

import java.time.*;
import java.time.format.*;
import java.time.temporal.*;

class Example
{
    private static void showDateInfo(LocalDate ld) {
        int weekOfYear = ld.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
        int dayOfWeek = ld.getDayOfWeek().getValue();
        System.out.println(ld.format(DateTimeFormatter.ISO_LOCAL_DATE) + " is week " + weekOfYear + ", day " + dayOfWeek);
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        LocalDate currentLocalDate = LocalDate.of(2019, 6, 30);
        showDateInfo(currentLocalDate);
        int dayOfWeek = currentLocalDate.getDayOfWeek().getValue();
        int weekOfYear = currentLocalDate.get(ChronoField.ALIGNED_WEEK_OF_YEAR);
        LocalDate resultLocalDate = currentLocalDate
            .minusYears(1)
            .with(ChronoField.ALIGNED_WEEK_OF_YEAR, weekOfYear)
            .with(ChronoField.DAY_OF_WEEK, dayOfWeek);
        showDateInfo(resultLocalDate);
    }
}

輸出:

2019-06-30 is week 26, day 7
2018-07-01 is week 26, day 7

我相信其他答案很接近,但還沒有完全到位。 據我了解,您想使用默認語言環境的周方案,而其他答案沒有這樣做。 我的建議是:

    WeekFields wf = WeekFields.of(Locale.getDefault());
    LocalDate today = LocalDate.now(ZoneId.of("Africa/Casablanca"));
    int week = today.get(wf.weekOfYear());
    int dow = today.get(wf.dayOfWeek());
    System.out.println("Today is " + today + ", "
            + today.getDayOfWeek() + " of week " + week);

    LocalDate correspondingDayLastYear = today.minusYears(1)
            .with(wf.weekOfYear(), week)
            .with(wf.dayOfWeek(), dow);
    System.out.println("Last year was " + correspondingDayLastYear + ", "
            + correspondingDayLastYear.getDayOfWeek()
            + " of week " + correspondingDayLastYear.get(wf.weekOfYear()));

剛才在我的電腦上運行時,輸出是:

 Today is 2019-06-30, SUNDAY of week 26 Last year was 2018-07-01, SUNDAY of week 26

當我將語言環境設置為美國時,我得到相同的日期,但由於美國周的定義不同,因此周數不同:

 Today is 2019-06-30, SUNDAY of week 27 Last year was 2018-07-01, SUNDAY of week 27

我相信也會有不同的語言環境會給你不同的日期的情況。

wf.dayOfWeek()為您提供一個字段,該字段根據該特定語言環境中的一周的第一天從 1 到 7 編號。 重要的是不僅要使用withDayOfWeek或等效的,否則如果不使用 ISO 周,您將面臨滑入不同周的風險。

我的答案仍然不會總是有效! 如果今天是在一年的第 53 周內,那很可能是去年沒有第 53 周。對此我們無能為力。 另一個我們無法解決的問題:在美國的周中,第 1 周從 1 月 1 日開始。如果這是星期日,則它是該周的第一天,但​​上一年的第 1 周從周五或周六開始,因此周1 沒有任何星期天。

如果您正在尋找 ISO 周年兼容功能,這對我有用 - 到目前為止 =]。

public class FiscalDateUtil {
    
    private static Logger log = LoggerFactory.getLogger(FiscalDateUtil.class);

    static public LocalDate previousYearComparisonDate(LocalDate date) {
    
        final int weekYear = date.get(IsoFields.WEEK_BASED_YEAR);
        final int weekLastYear = weekYear-1;
        
        final DayOfWeek dayOfWeek = date.getDayOfWeek();
        final int weekOfYear = date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
        final LocalDate adjustedLastYear = date
                .with(IsoFields.WEEK_BASED_YEAR, weekLastYear)
                .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekOfYear)
                .with(TemporalAdjusters.nextOrSame(dayOfWeek));

        if (log.isTraceEnabled()) {
            log.trace("starting date {}", date.toString());
            log.trace("starting date dow {}", date.getDayOfWeek());
            log.trace("lastYear {}", weekLastYear);
            log.trace("lastYear dow {}", dayOfWeek);
            log.trace("adjustedLastYear {}", adjustedLastYear.toString());
            log.trace("adjustedLastYear dow {}", adjustedLastYear.getDayOfWeek());  
        }
        return adjustedLastYear;
    }

}

您可以將自當前日期的年初以來的天數添加到前一年的年初。

這應該可以解決問題:

String dateStr = "2019-03-30";
LocalDate date = LocalDate.parse(dateStr);
LocalDate newDate = LocalDate.parse(date.getYear() + "-01-01").plusDays(date.getDayOfYear());
System.out.println(newDate);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM