Programing

이번 주와 달의 첫날을 얻는 방법은 무엇입니까?

lottogame 2020. 11. 13. 07:42
반응형

이번 주와 달의 첫날을 얻는 방법은 무엇입니까?


여러 이벤트의 날짜를 밀리 초 [1]로 표시했는데 이번 주와 이번 달에 어떤 이벤트가 있는지 알고 싶지만 첫날 (일 / 월 / 연도)을 얻는 방법을 알 수 없습니다. )을 실행하고 해당 월의 첫 번째 날과 동일한 밀리 초로 변환합니다.

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

이번 주 (밀리 초) :

// 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();

월의 1 일은 다음과 같이 결정할 수 있습니다.

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();

java.time

java.time의 나중에 자바 8 프레임 워크는 기존의 java.util.Date/.Calendar 클래스를 supplants. 이전 수업은 번거롭고 혼란스럽고 결함이있는 것으로 입증되었습니다. 그들을 피하십시오.

java.time 프레임 워크는 JSR 310에 의해 정의되고 ThreeTen-Extra 프로젝트에 의해 확장되고 Tutorial 에서 설명 된 매우 성공적인 Joda-Time 라이브러리에서 영감을 받았습니다 .

Instant

Instant클래스의 타임 라인에 잠시 나타냅니다 UTC를 .

java.time 프레임 워크의 해상도는 나노초 또는 소수 초의 9 자리입니다. 밀리 초는 분수 초의 3 자리입니다. 밀리 초 해상도 가 일반적 이기 때문에 java.time에는 편리한 팩토리 메소드가 포함되어 있습니다.

long millisecondsSinceEpoch = 1446959825213L;
Instant instant = Instant.ofEpochMilli ( millisecondsSinceEpoch );

millisecondsSinceEpoch : 1446959825213 인스턴트 : 2015-11-08T05 : 17 : 05.213Z

ZonedDateTime

이번 주와 이번 달을 고려하려면 특정 시간대를 적용해야합니다.

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );

zoneId : America / Montreal : 2015-11-08T00 : 17 : 05.213-05 : 00 [America / Montreal]

반 개방

날짜-시간 작업에서 우리는 일반적으로 시간 범위를 정의하기 위해 Half-Open 접근 방식을 사용합니다. 시작은 포괄적 이고 끝은 독점적 입니다. 한 주 (또는 월)의 마지막 분할 초를 결정하는 대신 다음 주 (또는 월) 의 첫 번째 순간을 얻습니다 . 따라서 1주는 월요일 의 첫 번째 순간부터 다음 월요일 의 첫 번째 순간 까지 올라가지 만 포함되지 않습니다 .

한주의 첫날, 마지막 날입니다. java.time 프레임 워크에는이를위한 도구, with메소드 및 ChronoField열거 형이 포함됩니다.

기본적으로 java.time은 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.time이 우리를 대신하여 조정하도록해야합니다. 그러려면 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을 확인하는 것 입니다.

예를 들어, thisZdtthatZdt둘 다 ZonedDateTime객체 라고 가정 합니다.

boolean inSameMonth = YearMonth.from( thisZdt ).equals( YearMonth.from( thatZdt ) ) ;

밀리 초

에포크에서 밀리 초 단위로 날짜 시간 작업을 수행하지 않는 것이 좋습니다. 그것은 실제로 날짜-시간 클래스가 내부적으로 작동하는 경향이 있지만 우리는 이유가 있습니다. 사람이 값을 알 수 없기 때문에 epoch에서 카운트를 처리하는 것은 서 투르므로 디버깅 및 로깅이 어렵고 오류가 발생하기 쉽습니다. 그리고 우리가 이미 보았 듯이 다른 해상도가 작용할 수 있습니다. 이전 Java 클래스와 Joda-Time 라이브러리는 밀리 초를 사용하는 반면 Postgres와 같은 데이터베이스는 마이크로 초를 사용하며 이제 java.time은 나노초를 사용합니다.

당신은 비트와 같은 텍스트를 처리 할 것인가, 또는 같은 클래스를 보자 않는 String, StringBuffer그리고 StringBuilder같은 세부 사항을 처리?

그러나 당신이 주장한다면, ZonedDateTimeget Instant에서를 얻고 그로부터 밀리 초 카운트를 얻습니다. 그러나이 호출은 데이터 손실을 의미 할 수 있습니다 . ZonedDateTime/에 Instant있을 수있는 모든 마이크로 초 또는 나노초는 잘립니다 (손실).

long millis = firstOfWeek.toInstant().toEpochMilli();  // Possible data loss.

java.time 정보

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?


주의!

while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) {
    calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week.
}

좋은 생각이지만 몇 가지 문제가 있습니다. 예를 들어 저는 우크라이나 출신이고 내 국가의 calendar.getFirstDayOfWeek ()는 2 (월요일)입니다. 그리고 오늘은 1 (일요일)입니다. 이 경우 calendar.add가 호출되지 않습니다.

따라서 올바른 방법은 ">"를 "! ="로 변경하는 것입니다.

while (calendar.get(Calendar.DAY_OF_WEEK) != calendar.getFirstDayOfWeek()) {...

매월 1 일을 가져 오려면 a를 가져 와서 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();
}

이에 대한 몇 가지 방법을 만들었습니다.

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());
}

여기에서 더 많은 것을 볼 수 있습니다 .


이 경우 :

// 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);

따라서 Calendar.HOUR_OF_DAY는 현재 실행 시간으로 8, 9, 12, 15, 18을 반환합니다. 나는 그러한 라인을 다음과 같이 변경하는 것이 더 나을 것이라고 생각합니다.

c.set(Calendar.HOUR_OF_DAY,0);

이렇게하면 하루가 항상 0 시간에 시작됩니다.


다음 달의 첫 번째 날짜를 얻으십시오 :-

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);

번호를 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 : manojdunna@gmail.com
*/
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);


    }

}

나는이 트릭을 사용하여 이번 달의 첫날을 얻습니다. 주문은 일요일 2, 화요일 3, 화요일 .... 등등에 대해 1입니다.

Calendar cal = new GregorianCalendar();
int startDay = cal.get(Calendar.DAY_OF_YEAR) % 7 + 1;
System.out.println(startDay);

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;     
}

참고URL : https://stackoverflow.com/questions/2937086/how-to-get-the-first-day-of-the-current-week-and-month

반응형