저는 Java를 처음 사용하는데 보통 PHP로 작업합니다.
이 문자열을 변환하려고합니다.
월요일 3 월 14 일 16:02:37 GMT 2011
다음과 같이 Year와 Month를 쉽게 가져올 수 있도록 Calendar 객체로
String yearAndMonth = cal.get(Calendar.YEAR)+cal.get(Calendar.MONTH);
수동으로 구문 분석하는 것이 좋지 않습니까? 부분 문자열 방법을 사용하십니까?
어떤 조언이라도 감사 할 것입니다!
답변
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
참고 : Locale
환경 / 요구 사항에 따라 설정
또한보십시오
답변
tl; dr
현대적인 접근법은 java.time 클래스를 사용합니다 .
YearMonth.from(
ZonedDateTime.parse(
"Mon Mar 14 16:02:37 GMT 2011" ,
DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" )
)
).toString()
2011-03
레거시 날짜-시간 수업 피하기
현대적인 방법은 java.time 클래스입니다. 오래된 날짜-시간 수업 Calendar
은 제대로 설계되지 않았고 혼란스럽고 번거로운 것으로 입증되었습니다.
문자열 입력과 일치하도록 사용자 정의 포맷터를 정의하십시오.
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
로 구문 분석하십시오 ZonedDateTime
.
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
당신은 년과 달에 관심이 있습니다. java.time 클래스에는 YearMonth
해당 목적을위한 클래스가 포함됩니다 .
YearMonth ym = YearMonth.from( zdt );
필요한 경우 연도 및 월 번호를 조사 할 수 있습니다.
int year = ym.getYear();
int month = ym.getMonthValue();
그러나이 toString
방법은 표준 ISO 8601 형식으로 문자열을 생성 합니다.
String output = ym.toString();
이것을 모두 합치십시오.
String input = "Mon Mar 14 16:02:37 GMT 2011";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
YearMonth ym = YearMonth.from( zdt );
int year = ym.getYear();
int month = ym.getMonthValue();
콘솔로 덤프하십시오.
System.out.println( "input: " + input );
System.out.println( "zdt: " + zdt );
System.out.println( "ym: " + ym );
입력 : 월요일 3 월 14 일 16:02:37 GMT 2011
zdt : 2011-03-14T16 : 02 : 37Z [GMT]
ym : 2011-03
라이브 코드
IdeOne.com에서 실행되는이 코드를 참조하십시오 .
변환
당신이 경우 해야한다 이 Calendar
객체를, 당신은으로 변환 할 수 있습니다 GregorianCalendar
기존의 클래스에 추가하여 새로운 방법.
GregorianCalendar gc = GregorianCalendar.from( zdt );
java.time에 대하여
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 – 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 현재의 유지 관리 모드 , java.time로 마이그레이션을 조언한다.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 클래스는 어디서 구할 수 있습니까?
- Java SE 8 및 SE 9 이상
- 내장.
- 번들로 구현 된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- 자바 SE 6 및 SE 7
- 대부분의 java.time 기능은 ThreeTen-Backport의 Java 6 & 7로 백 포트됩니다 .
- 기계적 인조 인간
- ThreeTenABP의 프로젝트는 적응 ThreeTen – 백 포트 특히 안드로이드에 대한 (위에서 언급).
- 사용 방법…을 참조하십시오 .
ThreeTen – 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
답변
글쎄, 나는 이미 클래스에 존재하는 코드를 복제하는 것은 나쁜 생각이라고 생각한다 SimpleDateFormat
.
반면에, 개인적으로는 피하는 게 좋을 것 Calendar
하고 Date
완전히 당신이 할 수있는 경우와 사용 Joda 시간을 훨씬 더 나은 설계 날짜와 시간 API로 대신. 예를 들어, 당신은 알 필요가 SimpleDateFormat
있다 없다 , 스레드 안전 당신 때문에 하나 필요 스레드 – 지역 주민, 동기화, 또는 새로운 인스턴스 당신이 그것을 사용할 때마다. Joda 파서 및 포맷터 는 스레드로부터 안전합니다.
답변
새 캘린더를 만들 필요가 없으며 SimpleDateFormat은 이미 아래 캘린더를 사용합니다.
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.EN_US);
Date date = sdf.parse("Mon Mar 14 16:02:37 GMT 2011"));// all done
Calendar cal = sdf.getCalendar();
(아직 댓글을 달 수 없기 때문에 새로운 답변을 만들었습니다)
답변
SimpleDateFormat
큰 단지 참고 인 HH
다른 hh
시간과 작업 할 때입니다. HH
24 시간 기준 시간을 반환하고 hh는 12 시간 기준 시간을 반환합니다.
예를 들어 다음은 12 시간을 반환합니다.
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm aa");
24 시간이 반환되지만
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
답변
시간대를 기준 Z
으로 패턴 으로 시간대를 사용하여 시간 구문 분석
String aTime = "2017-10-25T11:39:00+09:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
try {
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(aTime));
Log.i(TAG, "time = " + cal.getTimeInMillis());
} catch (ParseException e) {
e.printStackTrace();
}
출력 : UTC 시간을 반환합니다
1508899140000
우리는 같은 패턴으로 시간대를 설정하지 않은 경우 yyyy-MM-dd'T'HH:mm:ss
. SimpleDateFormat
에 설정된 시간대를 사용합니다Setting
답변
그렇습니다. 직접 파싱하는 것은 좋지 않습니다. SimpleDateFormat을 살펴보면 String이 Date로 바뀌고 Date를 Calendar 인스턴스로 설정할 수 있습니다.
