根据Java中的日期计算获取日期

时间:2013-04-26 03:11:14

标签: java date calendar

简单问题,但谷歌出人意料地对此毫无兴趣。我从今年1月1日开始number of days。如何将其转换为Java中的date

7 个答案:

答案 0 :(得分:7)

您只需使用SimpleDateFormatString转换为Date即可。模式D可用于表示年份的日期。

只要你有

int numberOfDays = 42; // Arbitrary number.

然后这个计算自1970年1月1日以来的天数(the Epoch

Date date = new SimpleDateFormat("D").parse(String.valueOf(numberOfDays));

或者,这个计算自当年1月1日以来的天数。

Date date = new SimpleDateFormat("D yyyy").parse(numberOfDays + " " + Calendar.getInstance().get(Calendar.YEAR));

答案 1 :(得分:3)

使用日历进行日期算术

    Calendar c = Calendar.getInstance();
    c.set(Calendar.YEAR, 2013);
    c.set(Calendar.MONTH, Calendar.JANUARY);
    c.set(Calendar.DATE, 1);
    c.set(Calendar.HOUR, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MILLISECOND, 0);
    c.add(Calendar.DATE, numberOfDays);
    Date date = c.getTime();

请注意,由于DST(夏令时),不同语言环境的结果可能会有所不同。上面的示例使用默认语言环境。

答案 2 :(得分:2)

我发现JodaTime在日期处理方面非常优雅。有了它,你可以这样做:

DateTime date = new DateTime().withDayOfYear(dayOfYear);

答案 3 :(得分:1)

TL;博士

Year.of( 2017 )
    .atDay( 159 )
  

2017年6月8日

...或当年......

Year.now( ZoneId.of( "America/Montreal" ) )
    .atDay( 159 )
  

2018年6月8日

走向另一个方向,从日期到日期。

LocalDate.now( ZoneId.of( "America/Montreal" )
         .getDayOfYear()
  

159

使用java.time

处理日期时间的现代方法是使用java.time类。麻烦的旧日期时间包。麻烦的旧日期时间类,例如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat现在是legacy,由java.time类取代。

Year类显然代表了一年。要获得当前年份,我们需要当前日期。

时区对于确定日期和年份至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,Paris France午夜后的几分钟是Montréal Québec中仍然是“昨天”的新一天。以同样的方式,在新年的巴黎午夜过后几分钟是新的一年,而在魁北克仍然是“去年”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
Year year = Year.now( z );

如果您有特定年份,请传递年份编号。

Year year = Year.of( 2017 );

Year类包含一种方法atDay,用于在LocalDate中传递从1到365或366的年份数字时生成Leap YearLocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate localDate = year.atDay( 159 );

走向另一个方向,您可以通过拨打LocalDate::getDayOfYear来查询LocalDate其日期。

int dayOfYear = localDate.getDayOfYear() ;

关于 java.time

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

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

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

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

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

答案 4 :(得分:0)

如果您是Android开发人员并使用JodaTime,这就是在Java 8中获得等效功能的方法。

LocalDate.ofYearDay("2020", 255).getDayOfWeek().getValue()

使用此选项是因为 ofYearDay 仅在Android> = 26以上版本受支持;

MutableDateTime mutableDateTime1 = new MutableDateTime();
mutableDateTime1.setYear("2020");
mutableDateTime1.setDayOfYear(255);
LocalDate.fromDateFields(mutableDateTime1.toDate()).getDayOfWeek();

答案 5 :(得分:0)

使用GregorianCalendarsimpleDateFormat

int days = 20;
GregorianCalendar dayCountofYear = new GregorianCalendar(2020,Calendar.JANUARY, 1);
dayCountofYear.add(Calendar.DAY_OF_YEAR, days);
System.out.println("GregorianCalendar: "+ dateFormat.format(dayCountofYear.getTime()));

可以通过以下函数调用来简化上述逻辑:

Date nextDate = addDaysToDate("01/01/2020", 20);
System.out.println("After Adding Number of Days:"+nextDate); // O/P:21/01/2020

完整示例:

public class DateHelper {

    public static void main(String[] args) throws ParseException {
        int days = 20;
        String initialDay = "01/01/2020";
        Date nextDate = addDaysToDate(initialDay, days);
        System.out.println("After Adding Number of Days:"+nextDate);

        /*Date firstDate = DateHelper.parseDate(initialDay, formatStr);
        int daysBetween = getDaysBetween(firstDate, nextDate);
        System.out.println(days + " - Days Between - "+daysBetween);*/
    }

    static String formatStr = "dd/MM/yyyy";
    static DateFormat dateFormat = new SimpleDateFormat(formatStr);
    static DateFormat reverseDateFormat = new SimpleDateFormat("yyyy/MM/dd");

    public static Date addDaysToDate(String specificDate, int daysCount) throws ParseException {
        Date date = dateFormat.parse(specificDate);
        GregorianCalendar gregCal = (GregorianCalendar) GregorianCalendar.getInstance(); // Current Date
        gregCal.setTime(date); // Change the Date to Provided One
        gregCal.add(Calendar.DAY_OF_YEAR, daysCount);
        Date time = gregCal.getTime();

        ZonedDateTime zdt = gregCal.toZonedDateTime();
        System.out.println("GregorianCalendar DayofWeek: "+ zdt.getDayOfWeek());
        return time;
    }
    public static String addDaysToDateStr(String specificDate, int daysCount) throws ParseException {
        String format = dateFormat.format( addDaysToDate(specificDate, daysCount) );
        System.out.println("GregorianCalendar [To a Date added Number of days leads to New Date]: "+ format);
        return format;
    }
    public static Date parseDate(String aSource, String formatStr) throws ParseException {
        DateFormat dateFormat = new SimpleDateFormat(formatStr);
        dateFormat.setLenient(false);
        return dateFormat.parse(aSource);
    }
    public static String formatDate(Date aDate, String formatStr, Calendar calendar) {
        DateFormat dateFormat = new SimpleDateFormat(formatStr);
        dateFormat.setLenient(false);
        dateFormat.setCalendar(calendar);
        return dateFormat.format(aDate);
    }
    public static String formatDate(Date aDate, String formatStr) {
        DateFormat dateFormat = new SimpleDateFormat( formatStr );
        //dateFormat.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("UTF")));
        return dateFormat.format(aDate);
    }
}

答案 6 :(得分:-1)

Calendar c = Calendar.getInstance();
         c.set(Calendar.YEAR, 2016);
         c.set(Calendar.MONTH, 8);
         c.set(Calendar.DAY_OF_YEAR, 244);
         c.set(Calendar.HOUR, 0);
         c.set(Calendar.MINUTE, 0);
         c.set(Calendar.SECOND, 0);
         c.set(Calendar.MILLISECOND, 0);
        Date date = c.getTime();