Как узнать дату начала и окончания года? - PullRequest
24 голосов
/ 21 февраля 2012

Я должен использовать класс Java Date для этой проблемы (он взаимодействует с чем-то вне моего контроля).

Как получить дату начала и окончания года, а затем выполнить итерацию по каждомудата

Ответы [ 13 ]

52 голосов
/ 23 ноября 2015

java.time

Использование библиотеки java.time, встроенной в Java 8 и более поздние версии. В частности, LocalDate и TemporalAdjusters классы.

import java.time.LocalDate
import static java.time.temporal.TemporalAdjusters.firstDayOfYear
import static java.time.temporal.TemporalAdjusters.lastDayOfYear

LocalDate now = LocalDate.now(); // 2015-11-23
LocalDate firstDay = now.with(firstDayOfYear()); // 2015-01-01
LocalDate lastDay = now.with(lastDayOfYear()); // 2015-12-31

Если вам нужно добавить информацию о времени, вы можете использовать любое доступное преобразование LocalDate в LocalDateTime, например

lastDay.atStartOfDay(); // 2015-12-31T00:00
39 голосов
/ 21 февраля 2012
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.DAY_OF_YEAR, 1);    
Date start = cal.getTime();

//set date to last day of 2014
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.MONTH, 11); // 11 = december
cal.set(Calendar.DAY_OF_MONTH, 31); // new years eve

Date end = cal.getTime();

//Iterate through the two dates 
GregorianCalendar gcal = new GregorianCalendar();
gcal.setTime(start);
while (gcal.getTime().before(end)) {
    gcal.add(Calendar.DAY_OF_YEAR, 1);
    //Do Something ...
}
5 голосов
/ 21 февраля 2012
 Calendar cal = new GregorianCalendar();
     cal.set(Calendar.DAY_OF_YEAR, 1);
     System.out.println(cal.getTime().toString());
     cal.set(Calendar.DAY_OF_YEAR, 366); // for leap years
     System.out.println(cal.getTime().toString());
4 голосов
/ 21 февраля 2012
    // suppose that I have the following variable as input
    int year=2011;
    Calendar calendarStart=Calendar.getInstance();
    calendarStart.set(Calendar.YEAR,year);
    calendarStart.set(Calendar.MONTH,0);
    calendarStart.set(Calendar.DAY_OF_MONTH,1);
    // returning the first date
    Date startDate=calendarStart.getTime();

    Calendar calendarEnd=Calendar.getInstance();
    calendarEnd.set(Calendar.YEAR,year);
    calendarEnd.set(Calendar.MONTH,11);
    calendarEnd.set(Calendar.DAY_OF_MONTH,31);

    // returning the last date
    Date endDate=calendarEnd.getTime();

Для итерации вы должны использовать объект календаря и увеличивать переменную day_of_month

Надеюсь, что это может помочь

2 голосов
/ 05 сентября 2016

Если вы ищете однострочное выражение, я обычно использую это:

new SimpleDateFormat("yyyy-MM-dd").parse(String.valueOf(new java.util.Date().getYear())+"-01-01")
1 голос
/ 05 мая 2017

Улучшение по сравнению с ответом Шрини.
Определите последнюю дату года, используя Calendar.getActualMaximum.

Calendar cal = Calendar.getInstance();

calDate.set(Calendar.DAY_OF_YEAR, 1);
Date yearStartDate = calDate.getTime();

calDate.set(Calendar.DAY_OF_YEAR, calDate.getActualMaximum(Calendar.DAY_OF_YEAR));
Date yearEndDate = calDate.getTime();
1 голос
/ 21 февраля 2012

Я предполагаю, что у вас есть экземпляр класса Date, и вам нужно найти первую дату и последнюю дату текущего года в терминах экземпляра класса Date. Вы можете использовать класс Calendar для этого. Создайте экземпляр календаря, используя предоставленный экземпляр класса даты. Установите для полей MONTH и DAY_OF_MONTH значения 0 и 1 соответственно, затем используйте метод getTime (), который будет возвращать экземпляр класса Date, представляющий первый день года. Вы можете использовать ту же технику, чтобы найти конец года.

    Date date = new Date();
    System.out.println("date: "+date);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

    System.out.println("cal:"+cal.getTime());

    cal.set(Calendar.MONTH, 0);
    cal.set(Calendar.DAY_OF_MONTH, 1);

    System.out.println("cal new: "+cal.getTime());
0 голосов
/ 06 сентября 2018

Первый и последний день года

import java.util.Calendar
import java.text.SimpleDateFormat

val parsedDateInt = new SimpleDateFormat("yyyy-MM-dd")

val cal2 = Calendar.getInstance()
cal2.add(Calendar.MONTH, -(cal2.get(Calendar.MONTH)))
cal2.set(Calendar.DATE, 1)
val firstDayOfYear = parsedDateInt.format(cal2.getTime)


cal2.add(Calendar.MONTH, (11-(cal2.get(Calendar.MONTH))))
cal2.set(Calendar.DATE, cal2.getActualMaximum(Calendar.DAY_OF_MONTH))
val lastDayOfYear = parsedDateInt.format(cal2.getTime)
0 голосов
/ 12 июня 2015

Обновление: Библиотека Joda-Time сейчас находится в режиме обслуживания, и ее команда советует перейти на классы java.time. Смотрите правильный java.time Ответ Przemek .

Часовой пояс

Другие ответы игнорируют критическую проблему часового пояса.

Joda-Time

Избегайте работы с датой и временем с заведомо хлопотным классом java.util.Date. Вместо этого используйте Joda-Time или java.time. Конвертировать в j.u.Date объекты по мере необходимости для взаимодействия.

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" ) ;
int year = 2015 ;
DateTime firstOfYear = new DateTime( year , DateTimeConstants.JANUARY , 1 , 0 , 0 , zone ) ;
DateTime firstOfNextYear = firstOfYear.plusYears( 1 ) ;
DateTime firstMomentOfLastDayOfYear = firstOfNextYear.minusDays( 1 ) ;

Преобразовать в java.util.Date

Конвертировать в j.u. Дату по мере необходимости.

java.util.Date d = firstOfYear.toDate() ;
0 голосов
/ 03 января 2014
GregorianCalendar gcal = new GregorianCalendar();
gcal.setTime(start);
while (gcal.getTime().before(end)) {
    gcal.add(Calendar.DAY_OF_YEAR, 1);
    //Do Something ...
}

Создание GregorianCalendar здесь бессмысленно.Фактически, просмотр исходного кода Calendar.java показывает, что Calendar.getInstance () уже дает экземпляр GregorianCalendar.

С уважением, Николас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...