변환하는 가장 좋은 방법은 무엇입니까 String
‘2010 년 1 월 2 일’형식의 Date
Java를 Java ?
궁극적으로 월, 일 및 연도를 정수로 나누고 사용할 수 있습니다.
Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();
날짜를 시간으로 변환합니다.
답변
그것은 어려운 방법이며, 이러한 java.util.Date
setter 메소드는 Java 1.1 (1997) 이후 더 이상 사용되지 않습니다. 입력 문자열과 일치하는 형식 패턴을 사용 SimpleDateFormat
하여 날짜 형식을 지정하십시오. .
“2010 년 1 월 2 일”의 특정 경우 입력 문자열 :
- “1 월”은 전체 텍스트 달이므로
MMMM
패턴을 사용하십시오. - “2”는 짧은 기간이므로
d
패턴을 사용하십시오. - “2010”은 4 자리 연도이므로
yyyy
패턴을 사용하십시오.
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010
명백한 Locale
주장 의 중요성에 주목하십시오 . 생략 하면 입력 문자열의 월 이름에 사용되는 영어가 아닌 기본 로케일 이 사용됩니다. 로케일이 입력 문자열과 일치하지 않으면 java.text.ParseException
형식 패턴이 유효 해 보일지라도 혼란스럽게 됩니다.
다음은 사용 가능한 모든 형식 패턴을 나열 하는 javadoc 의 관련성에 대한 추출입니다 .
Letter Date or Time Component Presentation Examples
------ ---------------------- ------------------ -------------------------------------
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M/L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
패턴은 대소 문자를 구분하며 4 자 이상의 텍스트 기반 패턴은 전체 형식을 나타냅니다. 그렇지 않으면 가능한 경우 짧거나 축약 된 형식이 사용됩니다. 따라서 예 MMMMM
이상이 불필요합니다.
다음은 SimpleDateFormat
주어진 문자열을 날짜별로 구문 분석하는 유효한 패턴의 예입니다 .
Input string Pattern
------------------------------------ ----------------------------
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01 EEE, MMM d, ''yy
12:08 PM h:mm a
12 o'clock PM, Pacific Daylight Time hh 'o''clock' a, zzzz
0:08 PM, PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3 YYYY-'W'ww-u
중요한 것은 스레드 안전 SimpleDateFormat
이 아니라는 것 입니다. 즉, 정적 또는 인스턴스 변수로 선언하고 할당 한 다음 다른 메소드 / 스레드에서 재사용해서는 안됩니다. 항상 메소드 로컬 범위 내에서 새 것으로 작성해야합니다.
자바 8 업데이트
Java 8 이상을 사용하는 경우 다음을 사용하십시오 DateTimeFormatter
(또한 여기에서 링크를 클릭하여 사전 정의 된 모든 포맷터 및 사용 가능한 형식 패턴을 확인 하십시오 (자습서는 여기에서 사용 가능함 )). 이 새로운 API는 JodaTime에서 영감을 받았습니다 .
String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02
참고 : 형식 패턴에 시간 부분이 포함 된 경우 LocalDateTime#parse(text, formatter)
대신 을 사용하십시오 LocalDate#parse(text, formatter)
. 또한 형식 패턴에 시간대가 포함되어 있으면 ZonedDateTime#parse(text, formatter)
대신 사용하십시오.
다음은 사용 가능한 모든 형식 패턴을 나열 하는 javadoc 의 관련성에 대한 추출입니다 .
Symbol Meaning Presentation Examples
------ -------------------------- ------------ ----------------------------------------------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
더 일반적인 패턴을 위해 미리 정의 된 포맷터 가 여러 개 있다는 점에 유의하십시오 . 예를 들어 대신을 DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
사용할 수 있습니다 DateTimeFormatter.RFC_1123_DATE_TIME
. 이는 SimpleDateFormat
스레드 안전 과 달리 가능 합니다. 따라서 필요한 경우 자신을 정의 할 수도 있습니다.
특정 입력 문자열 형식의 경우 명시 적을 사용할 필요가 없습니다 DateTimeFormatter
. 2016-09-26T17 : 44 : 57Z와 같은 표준 ISO 8601 날짜 LocalDateTime#parse(text)
는 이미 ISO_LOCAL_DATE_TIME
포맷터를 사용하므로 직접 구문 분석 할 수 있습니다 . 마찬가지로, LocalDate#parse(text)
시간 구성 요소없이 ISO 날짜를 구문 분석하고 (참조 ISO_LOCAL_DATE
) ZonedDateTime#parse(text)
오프셋과 시간대를 추가하여 ISO 날짜를 구문 분석합니다 (참조 ISO_ZONED_DATE_TIME
).
답변
아, 다시 Java Date 토론입니다. 날짜 조작을 처리하기 위해 Date , Calendar , GregorianCalendar 및 SimpleDateFormat을 사용 합니다. 예를 들어 1 월 날짜를 입력으로 사용 :
Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year -> "+mydate.get(Calendar.YEAR));
System.out.println("month -> "+mydate.get(Calendar.MONTH));
System.out.println("dom -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod -> "+mydate.get(Calendar.HOUR_OF_DAY));
그런 다음 다음과 같이 조작 할 수 있습니다.
Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year -> "+mydate.get(Calendar.YEAR));
System.out.println("month -> "+mydate.get(Calendar.MONTH));
System.out.println("dom -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod -> "+mydate.get(Calendar.HOUR_OF_DAY));
답변
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);
답변
Java 8에서는 새로운 날짜 / 시간 API ( JSR 310 )가 제공됩니다.
Joda-Time 에 의존하지 않고 Java 8에서 날짜를 구문 분석하는 데 다음 방법을 사용할 수 있습니다 .
String str = "January 2nd, 2010";
// if we 2nd even we have changed in pattern also it is not working please workout with 2nd
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);
// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1
LocalDate 는 날짜없이 시간을 나타내는 표준 Java 8 클래스입니다. 날짜 및 시간 정보가 포함 된 값을 구문 분석하려면 LocalDateTime 을 사용해야합니다 . 시간대가있는 값의 경우 ZonedDateTime을 사용 하십시오 . 둘 다 다음 parse()
과 유사한 방법을 제공합니다 LocalDate
.
LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);
DateTimeFormatter Javadoc 의 목록 형식 문자 :
All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters.
The following pattern letters are defined:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
답변
답변 중 일부는 기술적으로 정확하지만 권장되지 않습니다.
- java.util.Date & Calendar 클래스는 매우 귀찮습니다. 설계 및 구현상의 결함으로 인해이를 피하십시오. 다행히도 우리는 두 가지 다른 우수한 날짜-시간 라이브러리를 선택할 수 있습니다.
- Joda-Time
이 인기있는 오픈 소스 무료 라이브러리는 여러 Java 버전에서 사용할 수 있습니다. 사용법에 대한 많은 예는 StackOverflow에서 찾을 수 있습니다. 이 중 일부를 읽으면 빠르게 속도를 높일 수 있습니다. - java.time. * 패키지이
새로운 클래스 세트는 Joda-Time에서 영감을 얻어 JSR 310에 의해 정의되었습니다.이 클래스는 Java 8에 내장되어 있습니다. 이러한 클래스를 Java 7로 백 포트하는 프로젝트가 진행 중이지만 백 포트는 지원되지 않습니다. 신탁.
- Joda-Time
- Kristopher Johnson이 질문에 대한 그의 의견에서 올바르게 언급했듯이 다른 답변은 다음과 같은 중요한 문제를 무시합니다.
조다 타임
Joda-Time에 대한 몇 가지 메모가 이어집니다.
시간대
에 Joda 타임 하는 날짜 시간 객체는 진정으로 자신의 할당 시간대를 알고있다. 이 java.util.Date 클래스 대조를 보인다 시간대를 가지고 있지만하지 않습니다.
아래 예제 코드에서 표준 시간대 객체를 문자열을 구문 분석하는 포맷터에 전달하는 방법에 유의하십시오. 해당 시간대는 해당 시간대에서 발생한 날짜-시간을 해석하는 데 사용됩니다. 따라서 해당 문자열 입력으로 표시되는 시간대를 생각하고 결정해야합니다.
입력 문자열에 시간 부분이 없으므로 Joda-Time은 지정된 시간대의 첫 번째 순간을 시간으로 지정합니다. 일반적으로 일광 절약 시간제 (DST) 또는 기타 이상으로 00:00:00
인해 항상 그런 것은 아닙니다 . 그런데을 호출하여 모든 DateTime 인스턴스와 동일한 작업을 수행 할 수 있습니다 .withTimeAtStartOfDay
포맷터 패턴
포맷터의 패턴에 사용 된 문자는 Joda-Time에서 java.util.Date/Calendar의 문자와 유사하지만 정확히 동일하지는 않습니다. 문서를주의 깊게 읽으십시오.
불변성
우리는 일반적으로 Joda-Time에서 불변 클래스를 사용합니다. 기존 Date-Time 객체를 수정하는 대신 변경이 필요한 경우를 제외하고 대부분의 측면이 복사 된 다른 객체를 기반으로 새 인스턴스를 새로 만드는 메서드를 호출합니다. 예를 들어 withZone
아래 마지막 줄에 전화하는 것이 있습니다. 불변성 은 Joda-Time을 스레드로부터 안전하게 만들고 일부 작업을 더 명확하게 만들 수 있습니다.
변환
Joda-Time 객체에 대해 모르는 다른 클래스 / 프레임 워크와 함께 사용하려면 java.util.Date 객체가 필요합니다. 다행히도 앞뒤로 이동하는 것이 매우 쉽습니다.
java.util.Date 객체 (여기서는 date
)에서 Joda-Time DateTime으로 이동
org.joda.time.DateTime dateTime = new DateTime( date, timeZone );
Joda-Time에서 java.util.Date 오브젝트로 다른 방향으로 이동 중…
java.util.Date date = dateTime.toDate();
샘플 코드
String input = "January 2, 2010";
java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );
달릴 때…
dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z
답변
SimpleDateFormat 클래스를 처리하는 동안 Date는 스레드로부터 안전하지 않으며 단일 Date 객체를 여러 스레드와 공유 할 수 없다는 점을 기억해야합니다.
또한 작은 케이스는 몇 분, 대문자는 월은 “m”과 “M”사이에 큰 차이가 있습니다. “d”및 “D”와 동일합니다. 이로 인해 종종 간과되는 미묘한 버그가 발생할 수 있습니다. 자세한 내용은 Javadoc 또는 Java에서 문자열을 날짜로 변환하는 안내서를 참조하십시오.
답변
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
date = dateFormat.parse("2013-12-4");
System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013
String output = dateFormat.format(date);
System.out.println(output); // 2013-12-04
}
catch (ParseException e) {
e.printStackTrace();
}
그것은 나를 위해 잘 작동합니다.