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



У меня есть дата нескольких событий, выраженных в МС[1], и я хочу знать, какие события находятся внутри текущей недели и текущего месяца, но я не могу понять, как получить первый день (день/месяц/год) текущей недели и преобразовать его в миллисекунды, то же самое для первого дня месяца.



[1]Since January 1, 1970, 00:00:00 GMT
607   12  

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 проект, и объяснил, в учебник.

Instant

The 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

    Ничего не найдено.