이번 주와 달의 첫날을 얻는 방법은 무엇입니까?
여러 이벤트의 날짜를 밀리 초 [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
값 을 확인하는 것 입니다.
예를 들어, thisZdt
및 thatZdt
둘 다 ZonedDateTime
객체 라고 가정 합니다.
boolean inSameMonth = YearMonth.from( thisZdt ).equals( YearMonth.from( thatZdt ) ) ;
밀리 초
에포크에서 밀리 초 단위로 날짜 시간 작업을 수행하지 않는 것이 좋습니다. 그것은 실제로 날짜-시간 클래스가 내부적으로 작동하는 경향이 있지만 우리는 이유가 있습니다. 사람이 값을 알 수 없기 때문에 epoch에서 카운트를 처리하는 것은 서 투르므로 디버깅 및 로깅이 어렵고 오류가 발생하기 쉽습니다. 그리고 우리가 이미 보았 듯이 다른 해상도가 작용할 수 있습니다. 이전 Java 클래스와 Joda-Time 라이브러리는 밀리 초를 사용하는 반면 Postgres와 같은 데이터베이스는 마이크로 초를 사용하며 이제 java.time은 나노초를 사용합니다.
당신은 비트와 같은 텍스트를 처리 할 것인가, 또는 같은 클래스를 보자 않는 String
, StringBuffer
그리고 StringBuilder
같은 세부 사항을 처리?
그러나 당신이 주장한다면, ZonedDateTime
get 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 클래스는 어디서 구할 수 있습니까?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 이상 -번들로 구현 된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- Java SE 6 및 Java SE 7
- 대부분의 java.time 기능은 ThreeTen-Backport의 Java 6 및 7로 백 포트됩니다 .
- 기계적 인조 인간
- java.time 클래스 의 최신 버전의 Android 번들 구현 .
- 이전 Android (<26)의 경우 ThreeTenABP 프로젝트는 ThreeTen-Backport (위에서 언급)를 채택합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
주의!
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
'Programing' 카테고리의 다른 글
이 표현에 무슨 일이 일어나고 있습니까? (0) | 2020.11.13 |
---|---|
모호함을 통한 보안이 왜 나쁜 생각입니까? (0) | 2020.11.13 |
NSArray에서 객체의 인덱스를 얻습니까? (0) | 2020.11.13 |
Dispose가 'using'블록에 대해 호출되지 않는 상황이 있습니까? (0) | 2020.11.13 |
{{object.field}} 존재 여부를 확인하지 않으면 오류 (0) | 2020.11.13 |