如何从周/年解析为dd / mm / yyyy

时间:2019-01-13 09:48:23

标签: java string date calendar

我正在尝试将包含周/年信息的字符串解析为正常的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

3 个答案:

答案 0 :(得分:1)

如果您不在乎一周中的哪一天,则可以从元旦开始,然后添加任意多的周数:

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

以您的示例(2018年第20周)为例,2018-05-14是我。

答案 1 :(得分:1)

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的内置解析机制。无需手动解析或以其他方式重新发明轮子。为了使格式化程序了解我们的周计划,我将TemporalFieldWeekFields的{​​{1}}对象传递给我。要解析为DateTimeFormatterBuilder.appenValue,我们需要添加一周中的某一天(即使您说您不在乎哪个)。为此,我使用了对LocalDate的呼叫。

坦率地说,我很惊讶地看到java.time多么灵活地满足了您的要求。即使我已经知道与它一起工作是一种乐趣。

您使用的日期时间类-parseDefaultingCalendarGregorianCalendar-设计欠佳且过时了。我建议您不要使用它们。

链接: Oracle tutorial: Date Time解释了如何使用java.time。

答案 2 :(得分:0)

只需使用getTime即可获取Date对象

Date date =  gregorianCalendar.getTime();
  

返回一个Date对象,该对象代表此Calendar的时间值(距纪元的毫秒偏移量)。

或使用SimpleDateFormat 解析特定格式

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