繁体   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