Получить первую дату текущего месяца в java

Я пытаюсь добраться до и с даты, когда ToDate будет иметь предыдущую дату, а FromDate будет иметь первую дату текущего месяца. Для января это будет 1/1/2013 и так далее. Как правильно получить первую дату текущего месяца? Я не в состоянии это сделать.

today.add(Calendar.DAY_OF_MONTH, -1);
java.util.Date previousDay=today.getTime();
ToDate = sdfFile1.format(newjava.sql.Date(previousDay.getTime()));
today.add(Calendar.DATE, 1);
java.util.Date nextDay=today.getTime();
FromDate = sdfFile1.format(new java.sql.Date(nextDay.getTime()));
32
добавлено автор Woot4Moo, источник

6 ответы

пытаться

    Calendar c = Calendar.getInstance();  //this takes current date
    c.set(Calendar.DAY_OF_MONTH, 1);
    System.out.println(c.getTime());      //this returns java.util.Date

Обновлено ( Начиная с Java 8 ):

import java.time.LocalDate;
LocalDate todaydate = LocalDate.now();
System.out.println("Months first date in yyyy-mm-dd: " +todaydate.withDayOfMonth(1));
58
добавлено
Имейте в виду, что HOUR_OF_DAY , MINUTE , SECOND и MILLISECOND будут иметь значения, которые они имеют в момент создания экземпляр Calendar или Date . Вы можете установить эти значения равными 0, например. c.set (Calendar.MINUTE, 0) .
добавлено автор Ferran Maylinch, источник
См. Также этот ответ, который не имеет проблемы времени: stackoverflow.com/a/37710768/1121497
добавлено автор Ferran Maylinch, источник

ТЛ; др

Как правильно получить первую дату текущего месяца?

LocalDate.now()
         .with( TemporalAdjusters.firstDayOfMonth() )

Или…

YearMonth.now().atDay( 1 )

Или…

LocalDate.now().with ( ChronoField.DAY_OF_MONTH , 1 )

java.time

Структура java.time в Java 8 и более поздние версии заменяют старые классы java.util.Date/.Calendar. Старые классы оказались хлопотными, запутанными и ошибочными. Избежать их.

Структура java.time вдохновлена ​​очень успешной библиотекой Joda-Time , определенной JSR 310 , расширенный Проект ThreeTen-Extra и объясняется в Учебник .

<Код> LocalDate

For a date-only value, without time-of-day, use the <Код> LocalDate class. While <Код> LocalDate has no assigned time zone, we must specify a time zone in order to determine a date such as “today”. For example, a new day dawns earlier in Paris than in Montréal.

Часовой пояс имеет решающее значение для определения сегодняшней даты. В любой данный момент дата изменяется по всему миру по зонам. Опускание часового пояса означает, что текущий часовой пояс JVM автоматически применяется при определении текущей даты. Любой код в JVM может изменять значение по умолчанию во время выполнения, поэтому вы ходите по смещающимся пескам. Лучше указывать желаемый/ожидаемый часовой пояс явно, чем неявно ссылаться на текущий дефолт.

Укажите правильное название часового пояса в формате континент/регион , например Америка/Монреаль , Африка/Касабланка , или Pacific/Auckland , Никогда не используйте аббревиатуру 3-4 символов, например EST или IST , поскольку они являются not истинными часовыми поясами, не стандартизированы и даже не уникальны ( !).

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfCurrentMonth = today.with ( ChronoField.DAY_OF_MONTH , 1 );

Сбросьте консоль.

System.out.println ( "For zoneId: " + zoneId + " today is: " + today + " and first of this month is " + firstOfCurrentMonth );

Для zoneId: Америка/Монреаль сегодня: 2015-11-08 и первый из этого месяца - 2015-11-01

Кроме того, используйте TemporalAdjuster . Для вашей цели вы найдете удобные реализации в TemporalAdjusters (обратите внимание на множественное число s ), в частности firstDayOfMonth .

LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;

<Код> ZonedDateTime

Если вам нужно время суток, помните, что 00: 00: 00.000 not всегда первый момент дня из-за летнего времени (DST) и, возможно, других аномалий , Поэтому пусть java.time определяет правильное время первого момента дня.

ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
<Р> 2015-11-01T00: 00-04: 00 [Америка/Монреаль]


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time теперь находится в режим обслуживания , советует перейти на java.time .

Дополнительные сведения см. В Учебное пособие по Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация JSR 310 .

Где можно получить классы java.time?

Проект ThreeTen-Extra расширяет java.time с дополнительными классами , Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Интервал , YearWeek , < код> YearQuarter и подробнее ,

10
добавлено
Мне любопытно, почему вы не упомянули использование TemporalAdjusters.firstDayOfMonth() .
добавлено автор Dean Schulze, источник
@DeanSchulze Подход TemporalAdjuster работает тоже хорошо. Если вы хотите end месяца, то обязательно перейдите в TemporalAdjusters.lastDayOfMonth , так как мы не будем легко указывать определенный день месяца с помощью ChronoField.DAY_OF_MONTH .
добавлено автор Basil Bourque, источник
Calendar date = Calendar.getInstance();
date.set(Calendar.DAY_OF_MONTH, 1);
4
добавлено

Время Джоды

Если я правильно понимаю вопрос, это можно сделать очень легко, используя время Joda

LocalDate fromDate = new LocalDate().withDayOfMonth(1);
LocalDate toDate = new LocalDate().minusDays(1);
2
добавлено
Это мой предпочтительный ответ, потому что он устанавливает время на 0. Он идет с первого дня месяца (в 0:00) до предыдущего дня (в 0:00). Иногда вам может потребоваться установить toDate = new LocalDate() , чтобы он продлился до последней полуночи (0: 00h сегодняшнего дня).
добавлено автор Ferran Maylinch, источник

Работает как очарование!

public static String  getCurrentMonthFirstDate(){
    Calendar c = Calendar.getInstance();   
    c.set(Calendar.DAY_OF_MONTH, 1);
    DateFormat df = new SimpleDateFormat("MM-dd-yyyy");
    //System.out.println(df.format(c.getTime())); 
    return df.format(c.getTime());
}

//Correction :output =02-01-2018enter image description here

1
добавлено
Как отметил Оле В.В., неприятные старые классы времени, такие как java.util.Date , java.util.Calendar и java.text.SimpleDateFormat теперь legacy , вытесненный java.time классы, встроенные в Java 8 и Java 9. См. Учебник от Oracle .
добавлено автор Basil Bourque, источник
02-07-2018 вряд ли будет первым днем ​​текущего месяца? Класс SimpleDateFormat , который вы используете, не только давно устарел (например, Calendar )), но и печально известен. Пожалуйста, не научите молодых использовать его. Сегодня у нас гораздо лучше в java.time , современной Java API даты и времени .
добавлено автор Ole V.V., источник

Если вы также хотите, чтобы время было 0, код:

import java.util.*;
import java.text.*;

public class DateCalculations {
  public static void main(String[] args) {

    Calendar aCalendar = Calendar.getInstance();

    aCalendar.set(Calendar.DATE, 1);
    aCalendar.set(Calendar.HOUR_OF_DAY, 0);
    aCalendar.set(Calendar.MINUTE, 0);
    aCalendar.set(Calendar.SECOND, 0);

    Date firstDateOfCurrentMonth = aCalendar.getTime();

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zZ");
    sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

    String dayFirst = sdf.format(firstDateOfCurrentMonth);
    System.out.println(dayFirst);
  }
}

You can check online easily without compiling by using: http://www.browxy.com/

1
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async