我正在尝试将包含周/年信息的字符串解析为正常的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
答案 0 :(得分:1)
如果您不在乎一周中的哪一天,则可以从元旦开始,然后添加任意多的周数:
LocalDate date = LocalDate.of(year, 1, 1).plusWeeks(weekOfYear - 1)
以您的示例(2018年第20周)为例,2018-05-14
是我。
答案 1 :(得分:1)
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的内置解析机制。无需手动解析或以其他方式重新发明轮子。为了使格式化程序了解我们的周计划,我将TemporalField
到WeekFields
的{{1}}对象传递给我。要解析为DateTimeFormatterBuilder.appenValue
,我们需要添加一周中的某一天(即使您说您不在乎哪个)。为此,我使用了对LocalDate
的呼叫。
坦率地说,我很惊讶地看到java.time多么灵活地满足了您的要求。即使我已经知道与它一起工作是一种乐趣。
您使用的日期时间类-parseDefaulting
,Calendar
和GregorianCalendar
-设计欠佳且过时了。我建议您不要使用它们。
链接: 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());