在给出周数,工作日和年份的Java中获取日期

时间:2013-11-21 16:42:45

标签: java jodatime

鉴于一年中的一周,即工作日和一年,我们如何才能获得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));

但它获得了当前的日期!

6 个答案:

答案 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)

TL;博士

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.time类。

ThreeTen-EXTRA

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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore