簡體   English   中英

如何從周/年解析為dd / mm / yyyy

[英]How to parse from week/year to dd/mm/yyyy

我正在嘗試將包含周/年信息的字符串解析為正常的dd-mm-yyyy格式

import java.util.Calendar;
import java.util.*;
import java.text.*;
import java.util.GregorianCalendar;

public class FromWeektoDate {

public static void main(String[] args) {
    Calendar gregorianCalendar = new GregorianCalendar();
    gregorianCalendar.setFirstDayOfWeek(Calendar.SUNDAY);
    gregorianCalendar.setMinimalDaysInFirstWeek(4);

     String SemaineYear[] = "20/2018".split("/");


         int s = Integer.parseInt(SemaineYear[0]);
         int a = Integer.parseInt(SemaineYear[1]);
      int numWeekofYear = s;  //INPUT
       int year = a;         //INPUT

    gregorianCalendar.set(Calendar.YEAR , year);
    gregorianCalendar.set(Calendar.WEEK_OF_YEAR , numWeekofYear);

  Date date = new Date();

     date.setDay(gregorianCalendar.get(Calendar.DAY_OF_MONTH) );   
     date.setMonth(gregorianCalendar.get(Calendar.MONTH)  + 1 );
     date.setYear(gregorianCalendar.get
                        (Calendar.YEAR));

    System.out.println(date);
}
}

但我收到此錯誤:

 /tmp/java_5kSPR0/FirstDayofWeek.java:26: error: cannot find symbol date.setDay(gregorianCalendar.get(Calendar.DAY_OF_MONTH) ); ^ symbol: method setDay(int) location: variable date of type Date /tmp/java_5kSPR0/FirstDayofWeek.java:27: warning: [deprecation] setMonth(int) in Date has been deprecated 

如果您不在乎想要在一周中的哪一天,則可以從元旦開始,然后添加任意多的周數:

LocalDate date = LocalDate.of(year, 1, 1).plusWeeks(weekOfYear - 1)

例如(2018年第20周),這給了我2018-05-14

java.time

Java.time,現代的Java日期和時間API,可以做到這一點。

    // In Malta weeks begin on Sunday, and there must be at least 4 days
    // of a week in a year for it to be week 1 of that year
    WeekFields wf = WeekFields.of(Locale.forLanguageTag("mt"));

    DateTimeFormatter yearWeekFormatter = new DateTimeFormatterBuilder()
            .appendValue(wf.weekOfWeekBasedYear(), 2)
            .appendLiteral('/')
            .appendValue(wf.weekBasedYear(), 4)
            .parseDefaulting(ChronoField.DAY_OF_WEEK, wf.getFirstDayOfWeek().getValue())
            .toFormatter();

    String weekString = "20/2018";
    LocalDate sundayOfWeek20 = LocalDate.parse(weekString, yearWeekFormatter);
    System.out.println(sundayOfWeek20);

該代碼段的輸出為:

2018-05-13

若要格式化為13/05/2018,請使用另一個DateTimeFormatter

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    System.out.println(sundayOfWeek20.format(dateFormatter));

13/05/2018

我從您的代碼中了解到,您需要一個星期計划,其中星期從星期日開始,而第一周至少有4天。 WeekFields類用於定義這種方案。 如果您的要求來自特定的語言環境(馬耳他或愛爾蘭),則我建議使用該語言環境來定義要使用的WeekFields對象,就像在上面的代碼段中所做的那樣。 另一方面,如果您的要求不是來自某些區域設置,則最好直接指定它:

    WeekFields wf = WeekFields.of(DayOfWeek.SUNDAY, 4);

我正在通過LocalDate.parse使用java.time的內置解析機制。 無需手動解析或以其他方式重新發明輪子。 為了讓格式化程序了解我們的周計划,我將從WeekFields獲得的TemporalField對象傳遞給DateTimeFormatterBuilder.appenValue 要解析為LocalDate我們需要添加一周中的某一天(即使您說您不在乎哪個)。 我使用該調用來parseDefaulting

坦白說,我很驚訝地看到java.time能夠滿足您的需求。 即使我已經知道與它一起工作是一種樂趣。

您使用的日期,時間類- CalendarGregorianCalendarDate -的設計不當,早已過時。 我建議您不要使用它們。

鏈接: Oracle教程:Date Time說明如何使用java.time。

只需使用getTime獲取Date對象

Date date =  gregorianCalendar.getTime();

返回一個Date對象,該對象表示此Calendar的時間值(距紀元的毫秒偏移量)。

或使用SimpleDateFormat解析特定格式

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
dateFormat.setTimeZone(gregorianCalendar.getTimeZone());

暫無
暫無

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

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