Как получить первый день текущей недели и месяц?
У меня есть дата нескольких событий, выраженных в МС[1], и я хочу знать, какие события находятся внутри текущей недели и текущего месяца, но я не могу понять, как получить первый день (день/месяц/год) текущей недели и преобразовать его в миллисекунды, то же самое для первого дня месяца.
[1]Since January 1, 1970, 00:00:00 GMT
12 ответов:
на этой неделе в миллисекундах:
// get today and clear time of day Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day ! cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); // get start of this week in milliseconds cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); System.out.println("Start of this week: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis()); // start of the next week cal.add(Calendar.WEEK_OF_YEAR, 1); System.out.println("Start of the next week: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis());в этом месяце в миллисекундах:
// get today and clear time of day Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day ! cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); // get start of the month cal.set(Calendar.DAY_OF_MONTH, 1); System.out.println("Start of the month: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis()); // get start of the next month cal.add(Calendar.MONTH, 1); System.out.println("Start of the next month: " + cal.getTime()); System.out.println("... in milliseconds: " + cal.getTimeInMillis());
первый день недели можно определить с помощью
java.util.Calendarследующим образом:Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.setTimeInMillis(timestamp); while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) { calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week. } long firstDayOfWeekTimestamp = calendar.getTimeInMillis();первый день месяца можно определить следующим образом:
Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.setTimeInMillis(timestamp); while (calendar.get(Calendar.DATE) > 1) { calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of month. } long firstDayOfMonthTimestamp = calendar.getTimeInMillis();довольно многословен, да.
Java 7 будет поставляться с гораздо улучшенным API даты и времени (JSR-310). Если вы еще не можете переключиться, то вы можете использоватьJodaTime что делает его все менее сложно:
DateTime dateTime = new DateTime(timestamp); long firstDayOfWeekTimestamp = dateTime.withDayOfWeek(1).getMillis();и
DateTime dateTime = new DateTime(timestamp); long firstDayOfMonthTimestamp = dateTime.withDayOfMonth(1).getMillis();
Внимание!
while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) { calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week. }хорошая идея, но есть некоторые проблемы: Например, я из Украины и календарь.getFirstDayOfWeek() в моей стране 2 (Понедельник). А сегодня 1 (воскресенье). В данном случае календарь.добавить не называется.
Итак, правильный способ-это изменить " > "на"!= " :
while (calendar.get(Calendar.DAY_OF_WEEK) != calendar.getFirstDayOfWeek()) {...
java.время
The java.время фреймворк в Java 8 и позже вытесняет старую java.утиль.Дата./Календарь занятий. Старые классы оказались хлопотными, запутанными и ущербными. Избегать их.
java.временные рамки вдохновлены очень успешным Joda Времени библиотека, определяются JSR 310, продлен ThreeTen-Extra проект, и объяснил, в учебник.
InstantThe
Instantкласс представляет момент на временной шкале в UTC.java.временные рамки имеют разрешение наносекунд, или 9 цифр доли секунды. Миллисекунды - это всего лишь 3 цифры доли секунды. Потому что миллисекундным разрешением является общим, java.время включает в себя удобный заводской метод.
long millisecondsSinceEpoch = 1446959825213L; Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );millisecondsSinceEpoch: 1446959825213 is instant: 2015-11-08T05:17: 05.213 Z
ZonedDateTimeчтобы рассмотреть текущую неделю и текущий месяц, нам нужно применить определенный часовой пояс.
ZoneId zoneId = ZoneId.of ( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );в zoneId: Америка / Монреаль то есть: 2015-11-08T00: 17: 05.213-05: 00[Америка/Монреаль]
Полуоткрытых
в работе с датой и временем мы обычно используем полуоткрытый подход к определению промежутка времени. Начало включительно пока окончание в эксклюзивные. Вместо того, чтобы пытаться определить последнюю долю секунды конца недели (или месяца), мы получаем первый момент после неделю (или месяц). Так что неделя длится с понедельника и до но не в том числе в первый момент после понедельник.
давайте в первый день недели, и последний. Ява.временные рамки включают в себя инструмент для этого
withспособ иChronoFieldперечисление.по умолчанию, java.время использует ISO 8601 стандартные. Итак, понедельник-первый день недели (1), а воскресенье-последний (7).
ZonedDateTime firstOfWeek = zdt.with ( ChronoField.DAY_OF_WEEK , 1 ); // ISO 8601, Monday is first day of week. ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks ( 1 );эта неделя проходит с: 2015-11-02T00: 17: 05.213-05:00[Америка/Монреаль] до 2015-11-09T00:17:05.213-05: 00[Америка/Монреаль]
Упс! Посмотрите на время суток на этих значениях. Мы хотим первый момент дня. Первый момент дня не всегда
00:00:00.000из-за летнего времени (DST) или других аномалий. Поэтому мы должны позволить java.время сделать корректировку от нашего имени. Для этого мы должны пройти черезLocalDateкласса.ZonedDateTime firstOfWeek = zdt.with ( ChronoField.DAY_OF_WEEK , 1 ); // ISO 8601, Monday is first day of week. firstOfWeek = firstOfWeek.toLocalDate ().atStartOfDay ( zoneId ); ZonedDateTime firstOfNextWeek = firstOfWeek.plusWeeks ( 1 );эта неделя проходит с: 2015-11-02T00:00-05:00[Америка/Монреаль] до 2015-11-09T00:00-05: 00[Америка/Монреаль]
и то же самое за месяц.
ZonedDateTime firstOfMonth = zdt.with ( ChronoField.DAY_OF_MONTH , 1 ); firstOfMonth = firstOfMonth.toLocalDate ().atStartOfDay ( zoneId ); ZonedDateTime firstOfNextMonth = firstOfMonth.plusMonths ( 1 );что месяц работает с: 2015-11-01T00:00-04:00[Америка/Монреаль] до 2015-12-01T00:00-05: 00[Америка/Монреаль]
YearMonthеще один способ увидеть, если пара моментов в том же месяце, чтобы проверить то же самое
YearMonthзначение.например, если
thisZdtиthatZdtкакZonedDateTimeобъекты:boolean inSameMonth = YearMonth.from( thisZdt ).equals( YearMonth.from( thatZdt ) ) ;МС
я настоятельно рекомендую не делать вашу работу даты и времени в миллисекундах от эпохи. Это действительно способ, которым классы даты-времени, как правило, работают внутри, но у нас есть классы по какой-то причине. Обработка отсчета от эпохи является неуклюжей, поскольку значения не понятны людям, поэтому отладка и ведение журнала затруднены и подвержены ошибкам. И, как мы уже видели, различные разрешения могут быть в игре; старые классы Java и библиотека Joda-Time используют миллисекунды, в то время как базы данных, такие как Postgres, используют микросекунды, а теперь java.время использует наносекунды.
будет вы обрабатываете текст как биты, или вы позволяете классы, такие как
String,StringBufferиStringBuilderобрабатывать такие детали?но если вы настаиваете, с
ZonedDateTimeполучитьInstant, и от этого получаем миллисекунды-отсчет-от-эпохи. Но имейте в виду этот вызов может означать потерю данных. Любые микросекунды или наносекунды, которые вы могли бы иметь в вашемZonedDateTime/Instantбудет усечен (потерян).long millis = firstOfWeek.toInstant().toEpochMilli(); // Possible data loss.
чтобы получить первый день месяца, просто получить
Dateи установите текущий день на день 1 месяца. Очистите час, минуту, секунду и миллисекунды, если вам это нужно.private static Date firstDayOfMonth(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DATE, 1); return calendar.getTime(); }первый день недели-это то же самое, но с использованием
Calendar.DAY_OF_WEEKвместоprivate static Date firstDayOfWeek(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_WEEK, 1); return calendar.getTime(); }
в этом случае:
// get today and clear time of day Calendar cal = Calendar.getInstance(); cal.clear(Calendar.HOUR_OF_DAY); <---- is the current hour not 0 hour cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND);Итак, календарь.HOUR_OF_DAY возвращает 8, 9, 12, 15, 18 в качестве текущего рабочего часа. Я думаю будет лучше изменить такую строку:
c.set(Calendar.HOUR_OF_DAY,0);таким образом, день всегда начинается в 0 час
вы должны быть в состоянии преобразовать свой номер в календарь Java, например:
Calendar.getInstance().setTimeInMillis(myDate);оттуда сравнение не должно быть слишком сложным.
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Scanner; /** This Program will display day for, 1st and last days in a given month and year @author Manoj Kumar Dunna Mail Id : [email protected] */ public class DayOfWeek { public static void main(String[] args) { String strDate = null; int year = 0, month = 0; Scanner sc = new Scanner(System.in); System.out.print("Enter YYYY/MM: "); strDate = sc.next(); Calendar cal = new GregorianCalendar(); String [] date = strDate.split("/"); year = Integer.parseInt(date[0]); month = Integer.parseInt(date[1]); cal.set(year, month-1, 1); System.out.println(new SimpleDateFormat("EEEE").format(cal.getTime())); cal.add(Calendar.MONTH, 1); cal.add(Calendar.DAY_OF_YEAR, -1); System.out.println(new SimpleDateFormat("EEEE").format(cal.getTime())); } }
Simple Solution: package com.util.calendarutil; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class CalUtil { public static void main(String args[]){ DateFormat df = new SimpleDateFormat("dd/mm/yyyy"); Date dt = null; try { dt = df.parse("23/01/2016"); } catch (ParseException e) { System.out.println("Error"); } Calendar cal = Calendar.getInstance(); cal.setTime(dt); cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); Date startDate = cal.getTime(); cal.add(Calendar.DATE, 6); Date endDate = cal.getTime(); System.out.println("Start Date:"+startDate+"End Date:"+endDate); } }
Я создал некоторые методы для этого:
public static String catchLastDayOfCurrentWeek(String pattern) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); return calendarToString(cal, pattern); } public static String catchLastDayOfCurrentWeek(String pattern) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.clear(Calendar.MINUTE); cal.clear(Calendar.SECOND); cal.clear(Calendar.MILLISECOND); cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); cal.add(Calendar.WEEK_OF_YEAR, 1); cal.add(Calendar.MILLISECOND, -1); return calendarToString(cal, pattern); } public static String catchTheFirstDayOfThemonth(Integer month, pattern padrao) { Calendar cal = GregorianCalendar.getInstance(); cal.setTime(new Date()); cal.set(Calendar.MONTH, month); cal.set(Calendar.DAY_OF_MONTH, 1); return calendarToString(cal, pattern); } public static String catchTheLastDayOfThemonth(Integer month, String pattern) { Calendar cal = GregorianCalendar.getInstance(); cal.setTime(new Date()); cal.set(cal.get(Calendar.YEAR), month, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); return calendarToString(cal, pattern); } public static String calendarToString(Calendar calendar, String pattern) { if (calendar == null) { return ""; } SimpleDateFormat format = new SimpleDateFormat(pattern, LocaleUtils.DEFAULT_LOCALE); return format.format(calendar.getTime()); }вы можете видеть больше здесь.
получить первое число следующего месяца: -
SimpleDateFormat df = new SimpleDateFormat("MM-dd-yyyy"); String selectedDate="MM-dd-yyyy like 07-02-2018"; Date dt = df.parse(selectedDate);`enter code here` calendar = Calendar.getInstance(); calendar.setTime(dt); calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1); String firstDate = df.format(calendar.getTime()); System.out.println("firstDateof next month ==>" + firstDate);
public static void main(String[] args) { System.out.println(getMonthlyEpochList(1498867199L,12,"Monthly")); } public static Map<String,String> getMonthlyEpochList(Long currentEpoch, int noOfTerms, String timeMode) { Map<String,String> map = new LinkedHashMap<String,String>(); int month = 0; while(noOfTerms != 0) { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, month); calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); Date monthFirstDay = calendar.getTime(); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); Date monthLastDay = calendar.getTime(); map.put(getMMYY(monthFirstDay.getTime()), monthFirstDay + ":" +monthLastDay); month--; noOfTerms--; } return map; }
Comments