Java에서 시간 없이 데이트하려면 어떻게 해야 하나요?
스택 오버플로 질문 Java 프로그램에서 계속하여 타임스탬프 없이 현재 날짜를 가져옵니다.
시간 없이 날짜 개체를 가져오는 가장 효율적인 방법은 무엇입니까?이 두 가지 외에 다른 방법이 있나요?
// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));
// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();
업데이트:
Joda-Time에 대해 알고 있었습니다.그렇게 간단한 작업을 위해 라이브러리를 추가하는 것을 피하려고 했을 뿐입니다.하지만 지금까지의 답변으로 볼 때 Joda-Time은 매우 인기가 있는 것 같기 때문에 고려해 볼 수도 있습니다.
효율적이라는 것은 일시적인 오브젝트를 피하고 싶다는 것입니다.
String
에서method 1
동안, ,는. . . . . . . . . . . . . . .method 2
해해라라기기해해해해해해해
꼭 이 제품을 사용해야만 합니까?java.util.Date
Joda Time을 사용하시거나java.time
패키지가 Java 8에서 대체되었습니다.특히, 날짜 및 달력은 항상 특정 순간을 나타내며, "그냥 날짜"와 같은 개념은 없지만 Joda 시간에는 이를 나타내는 유형이 있습니다.LocalDate
할 수 , 해집니다). 실제로 하려고 하는 작업을 나타내는 타입을 사용할 수 있으면 코드가 훨씬 명확해집니다.
이나 조다 시간을 사용하는 있습니다.java.time
「」, Discription" java.util
API를 사용합니다.합니다.java.util.Date
예를 들어 데이터베이스 상호 작용을 위해 필요한 경우 자체 코드의 경계에 있습니다.
기기 to로 했을 때 입니다.00:00:00
:
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date today = new Date();
Date todayWithZeroTime = formatter.parse(formatter.format(today));
Apache Commons 라이브러리에서 DateUtils.truncate를 사용할 수 있습니다.
예:
DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)
dr;dr
이 두 가지 외에 다른 방법이 있나요?
네, 있습니다.
LocalDate.now(
ZoneId.of( "Pacific/Auckland" )
)
java.time
Java 8 이후에는 새로운 java.time 패키지가 내장되어 있습니다.튜토리얼을 참조해 주세요.java.time 기능의 대부분은 ThreeTen-Backport의 Java 6 및7에 백포트되며 ThreeTenABP의 Android에 더욱 적응합니다.
Joda-Time과 마찬가지로 java.time은 시간대 없이 날짜만 값을 나타내는 클래스를 제공합니다.
타임존은 특정 날짜를 결정하는 데 매우 중요합니다.예를 들어 파리에서는 자정이 되어도 몬트렐에서는 여전히 "어제" 날짜입니다.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
기본적으로 java.time은 ISO 8601 표준을 사용하여 날짜 또는 날짜 값의 문자열 표현을 생성합니다.(Joda-Time과의 또 다른 유사점)전화를 걸어 다음과 같은 텍스트를 생성하십시오.2015-05-21
.
String output = today.toString() ;
java.time 정보
java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.
현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.
자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.
java.time 클래스는 어디서 얻을 수 있습니까?
- 자바 SE 8, 자바 SE 9 이후
- 붙박이.
- 번들 구현이 포함된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되어 있습니다.
- 자바 SE 6 및 자바 SE 7
- java.time 기능의 대부분은 ThreeTen 백포트의 Java 6 및7로 백포트됩니다.
- 안드로이드
- 최신 버전의 Android 번들 구현 java.time 클래스.
- 이전의 Android에서는 쓰리텐ABP 프로젝트는 ThreeTen-Backport(상기)를 채택하고 있습니다.'쓰리텐ABP 사용방법'을 참조하십시오.
쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 등 유용한 클래스가 있습니다.
가장 간단한 방법:
long millisInDay = 60 * 60 * 24 * 1000;
long currentTime = new Date().getTime();
long dateOnly = (currentTime / millisInDay) * millisInDay;
Date clearDate = new Date(dateOnly);
이러한 질문에 대한 표준 대답은 Joda Time을 사용하는 것입니다.API가 더 우수하며 포메터 및 파서를 사용하는 경우 직관적이지 않은 스레드 안전성 부족을 피할 수 있습니다.SimpleDateFormat
Joda를 사용하면 다음 작업을 간단히 수행할 수 있습니다.
LocalDate d = new LocalDate();
업데이트:Java 8을 사용하면 다음 방법으로 해결할 수 있습니다.
LocalDate date = LocalDate.now();
간단한 방법은 다음과 같습니다.
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateOnly.format(cal.getTime()));
표준 Java 런타임의 Date 루틴에 대해 타임스탬프가 없는 날짜를 말하는 것은 의미가 없습니다.이는 기본적으로 날짜가 아닌 특정 밀리초로 매핑되기 때문입니다.Said seconds는 본질적으로 하루 중 시간이 부가되어 있기 때문에 일광 절약 시간이나 다른 캘린더 조정과 같은 시간대 문제에 취약합니다.참조: 1927년에 이 두 번을 빼면 이상한 결과가 나타나는 이유는 무엇입니까?흥미로운 예를 들면요.
밀리초가 아닌 날짜로 작업하려면 다른 방법을 사용해야 합니다.Java 8에는 사용자가 원하는 것을 제공하는 새로운 메서드 세트가 있습니다.Java 7 이전 버전에서는 http://www.joda.org/joda-time/ 를 사용합니다.
// 09/28/2015
System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));
// Mon Sep 28
System.out.println( new Date().toString().substring(0, 10) );
// 2015-09-28
System.out.println(new java.sql.Date(System.currentTimeMillis()));
// 2015-09-28
// java 8
System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class
물론 가장 올바른 방법은 아니지만, 시간을 들이지 않고 날짜를 얻기 위해 빠른 해결책이 필요하고 서드파티 라이브러리를 사용하지 않으려면 이 방법이 필요합니다.
Date db = db.substring(0, 10) + db.substring(23,28);
저는 시각적인 목적으로만 날짜가 필요했고 Joda를 할 수 없었기 때문에 서브스트링을 했습니다.
「와 같이, 「 12 EDT , 「YYY-MM-DD」와 같이 는, 「YYYY-MM-DD」를 .java.sql.Date
다음 예제에서는 현재 날짜를 가져옵니다.
new java.sql.Date(System.currentTimeMillis());
한 also도.java.sql.Date
는 의 입니다.java.util.Date
.
글쎄요, 표준 JDK만 사용한다면 이 작업을 쉽게 수행할 수 있는 방법은 없는 것으로 알고 있습니다.
물론 method2의 논리를 여기 toBeginningOf에서처럼 도우미 클래스의 정적 함수에 넣을 수 있습니다.The Day-method
다음으로 두 번째 방법을 다음과 같이 단축할 수 있습니다.
Calendar cal = Calendar.getInstance();
Calendars.toBeginningOfTheDay(cal);
dateWithoutTime = cal.getTime();
또는 이 포맷의 요일이 그렇게 자주 필요한 경우 다른 스태틱도우미 방식으로 정리하면 원라이너로 만들 수 있습니다.
시간 없이 현재 날짜만 필요한 경우 다음 옵션을 사용할 수 있습니다.
DateTime.now().withTimeAtStartOfDay()
LocalDate.now()
로 변환합니다.Date
음음음같 뭇매하다
Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
이건 어때?
public static Date formatStrictDate(int year, int month, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, dayOfMonth, 0, 0, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
반향 목적으로만 날짜 부분이 필요한 경우
Date d = new Date();
String dateWithoutTime = d.toString().substring(0, 10);
조다 시간을 사용하셔도 됩니다.
private Date dateWitoutTime(Date date){
return new LocalDate(date).toDate()
}
다음과 같이 문의합니다.
Date date = new Date();
System.out.println("Without Time = " + dateWitoutTime(date) + "/n With time = " + date);
Veyder-time을 보세요.이것은 java.util과 Joda-time을 대체하는 간단하고 효율적인 방법입니다.직관적인 API와 타임스탬프 없이 날짜만 나타내는 클래스가 있습니다.
Java의 거대한 TimeZone 데이터베이스를 최대한 활용하는 가장 직접적인 방법은 다음과 같습니다.
long currentTime = new Date().getTime();
long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime);
다음은 문자열 및 뒤로 변환되지 않는 클린 솔루션이며, 시간의 각 구성 요소를 0으로 리셋해도 시간이 여러 번 재계산되지 않습니다., 「」를 사용합니다.%
(계수)이중 연산을 피하기 위해 나눗셈 뒤에 곱셈을 하는 것이 아니라.
서드파티 의존관계가 필요하지 않으며 전달된 캘린더 객체의 타임존을 존중합니다.이 함수는 전달한 날짜(캘린더)의 표준 시간대로 오전 12시에 지정된 시간을 반환합니다.
public static Calendar date_only(Calendar datetime) {
final long LENGTH_OF_DAY = 24*60*60*1000;
long millis = datetime.getTimeInMillis();
long offset = datetime.getTimeZone().getOffset(millis);
millis = millis - ((millis + offset) % LENGTH_OF_DAY);
datetime.setTimeInMillis(millis);
return datetime;
}
가능한 한 서드파티 라이브러리를 사용하지 않는 것이 좋습니다.이전에도 이 방법이 언급되어 있는 것은 알고 있습니다만, 여기 깔끔한 방법이 있습니다.
/*
Return values:
-1: Date1 < Date2
0: Date1 == Date2
1: Date1 > Date2
-2: Error
*/
public int compareDates(Date date1, Date date2)
{
SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");
try
{
date1 = sdf.parse(sdf.format(date1));
date2 = sdf.parse(sdf.format(date2));
}
catch (ParseException e) {
e.printStackTrace();
return -2;
}
Calendar cal1 = new GregorianCalendar();
Calendar cal2 = new GregorianCalendar();
cal1.setTime(date1);
cal2.setTime(date2);
if(cal1.equals(cal2))
{
return 0;
}
else if(cal1.after(cal2))
{
return 1;
}
else if(cal1.before(cal2))
{
return -1;
}
return -2;
}
음, 그레고리 캘린더를 사용하지 않는 것도 하나의 옵션일 수 있습니다!
방금 앱용으로 만들었습니다.
public static Date getDatePart(Date dateTime) {
TimeZone tz = TimeZone.getDefault();
long rawOffset=tz.getRawOffset();
long dst=(tz.inDaylightTime(dateTime)?tz.getDSTSavings():0);
long dt=dateTime.getTime()+rawOffset+dst; // add offseet and dst to dateTime
long modDt=dt % (60*60*24*1000) ;
return new Date( dt
- modDt // substract the rest of the division by a day in milliseconds
- rawOffset // substract the time offset (Paris = GMT +1h for example)
- dst // If dayLight, substract hours (Paris = +1h in dayLight)
);
}
Android API 레벨 1, 외부 라이브러리 없음daylight 및 default timeZone을 존중합니다.String 조작이 없기 때문에, 이 방법이 당신보다 CPU 효율이 높다고 생각합니다만, 아직 테스트는 실시하지 않았습니다.
SimpleDateFormat을 사용하여 원하는 날짜 형식을 지정할 수 있습니다.다음으로 작업 예를 제시하겠습니다.
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(dateFormat.format(new Date())); //data can be inserted in this format function
출력:
15/06/2021
언급URL : https://stackoverflow.com/questions/5050170/how-do-i-get-a-date-without-time-in-java
'programing' 카테고리의 다른 글
VueJS 디스패치 기능의 실행 순서에서 문제가 발생하고 있습니다. (0) | 2022.08.03 |
---|---|
모달 vue에서 윈도우 프린트를 사용하려면 어떻게 해야 하나요? (0) | 2022.08.03 |
Vuex4 - 정의되지 않은 속성을 읽을 수 없음('상태' 읽기) (0) | 2022.08.03 |
C의 >>>= 연산자는 무엇입니까? (0) | 2022.08.03 |
DecimalFormat의 소수점 구분 기호를 쉼표에서 점/점으로 변경하는 방법 (0) | 2022.08.03 |