鉴于一年中的一周,即工作日和一年,我们如何才能获得Java中的日期?
使用Jodatime,我尝试了以下内容:
DateTime dt = new DateTime();
dt.withYear(year);
dt.withWeekOfWeekyear(weekOfYear);
dt.withDayOfWeek(weekDay);
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyMMdd");
System.out.println(dateTimeFormatter.print(dt));
但它获得了当前的日期!
答案 0 :(得分:6)
JodaTime返回一个已更改的副本,所以:
DateTime dt = new DateTime()
.withWeekyear(year)
.withWeekOfWeekyear(weekOfYear)
.withDayOfWeek(weekDay);
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyMMdd");
System.out.println(dateTimeFormatter.print(dt));
这应该按预期工作。
答案 1 :(得分:2)
接受的答案有错误。.withYear(year)
应为withWeekyear(year)
。 @Neet请更新。
答案 2 :(得分:1)
之后您需要重新分配日期! dt.with *()方法只是复制日期。
尝试
DateTime dt = new DateTime();
dt = dt.withYear(year);
dt = dt.withWeekOfWeekyear(weekOfYear);
dt = dt.withDayOfWeek(weekDay);
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyMMdd");
System.out.println(dateTimeFormatter.print(dt));
答案 3 :(得分:1)
我们也可以使用Calendar类来使用这个本机java代码:
SimpleDateFormat sdf = new SimpleDateFormat("MM dd yyyy");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.WEEK_OF_YEAR, 23);
cal.set(Calendar.DAY_OF_WEEK, 3);
cal.set(Calendar.YEAR,2013);
System.out.println(sdf.format(cal.getTime()));
答案 4 :(得分:1)
以下是没有JodaTime的简单示例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Snippet {
public static void main(String args[]) {
String year = "2013";
String week_of_year = "46";
String day_of_week = "4";
String yearweekday = year + week_of_year + day_of_week;
SimpleDateFormat sdf = new SimpleDateFormat("yyyywwu");
Date date = null;
try {
date = sdf.parse(yearweekday);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date);
}
}
祝你好运!
答案 5 :(得分:0)
YearWeek.of( 2017 , 1 )
.atDay( DayOfWeek.TUESDAY )
.format( DateTimeFormatter.ofPattern( "uuMMdd" ) )
“周”这个词含糊不清。你的意思是第1周包含1月1日?或者第1周包含一个特定日期的第一天,例如星期日或星期一?
或者你的意思是标准ISO 8601 week?引用YearWeek
doc:
ISO-8601将星期定义为始终从星期一开始。第一周是包含该日历年的第一个星期四的一周。因此,本课程中使用的以周为基础的年份与日历年不一致。
现代方法使用java.time类。
java.util.Date
,java.util.Calendar
和java.text.SimpleTextFormat
现在是legacy,取代了java.time类。 ThreeTen-Extra项目扩展了具有附加功能的java.time。这包括一个方便的YearWeek
课程,正是我们对本课题所需要的。
指定基于周的年份编号和周编号。
YearWeek yw = YearWeek.of( 2017 , 1 ) ;
LocalDate
类表示没有时间且没有时区的仅限日期的值。
您可以要求YearWeek
对象确定一周内包含的一天的日期。指定DayOfWeek
枚举对象。请注意,DayOfWeek
是一个对象,而不仅仅是整数或字符串,提供type-safety和有效值。
LocalDate ld = yw.atDay( DayOfWeek.TUESDAY ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。