문자열 내 날짜 = 2014/10/29 18:10:45를 다음과 같이 변환하고 싶습니다. 긴 ms (즉, 현재인밀리)
로 변환하고 싶습니다. 구글에서 찾아봤지만 ms를 date로 변환하는 방법만 찾을 수 있습니다.
참고 : 명확하게하기 위해 1970/1/1 형식의 날짜에서 ms를 가져오고 싶습니다.
'날짜'가 아니라 날짜의 '문자열' 표현이 있습니다. '문자열'을 '날짜'로 변환한 다음 밀리초를 구해야 합니다. '문자열'을 '날짜'로 변환하거나 그 반대로 변환하려면 SimpleDateFormat
클래스를 사용해야 합니다.
다음은 원하는/필요한 작업의 예입니다(여기서는 시간대가 포함되지 않았다고 가정합니다):
String myDate = "2014/10/29 18:10:45";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(myDate);
long millis = date.getTime();
하지만 Java에서 얻은 밀리초는 원하는 에포크와 1970-01-01 00:00:00 사이의 밀리초이므로 주의해야 합니다.
Java 8부터 사용 가능한 새로운 날짜/시간 API를 사용합니다:
String myDate = "2014/10/29 18:10:45";
LocalDateTime localDateTime = LocalDateTime.parse(myDate,
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss") );
/*
With this new Date/Time API, when using a date, you need to
specify the Zone where the date/time will be used. For your case,
seems that you want/need to use the default zone of your system.
Check which zone you need to use for specific behaviour e.g.
CET or America/Lima
*/
long millis = localDateTime
.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
LocalDateTime.parse( // Parse into an object representing a date with a time-of-day but without time zone and without offset-from-UTC.
"2014/10/29 18:10:45" // Convert input string to comply with standard ISO 8601 format.
.replace( " " , "T" ) // Replace SPACE in the middle with a `T`.
.replace( "/" , "-" ) // Replace SLASH in the middle with a `-`.
)
.atZone( // Apply a time zone to provide the context needed to determine an actual moment.
ZoneId.of( "Europe/Oslo" ) // Specify the time zone you are certain was intended for that input.
) // Returns a `ZonedDateTime` object.
.toInstant() // Adjust into UTC.
.toEpochMilli() // Get the number of milliseconds since first moment of 1970 in UTC, 1970-01-01T00:00Z.
1414602645000
정답은 정답이지만 시간대라는 중요한 문제를 무시하고 있습니다. 입력 문자열이 파리 또는 몽트르알의 오후 6:10인가요? 아니면 UTC?
적절한 시간대 이름]2을 사용하세요. 일반적으로 대륙과 도시/지역을 더합니다. 예: 유럽/오슬로
. 표준화되지도 않고 고유하지도 않은 3글자 또는 4글자 코드는 피하세요.
최신 접근 방식은 java.time 클래스를 사용합니다.
ISO 8601]3 표준을 준수하도록 입력을 변경하세요. 중간에 있는 공백을 T
로 바꿉니다. 그리고 슬래시 문자를 하이픈으로 바꿉니다. java.time* 클래스는 문자열을 구문 분석/생성할 때 기본적으로 이러한 표준 형식을 사용합니다. 따라서 서식 패턴을 지정할 필요가 없습니다.
String input = "2014/10/29 18:10:45".replace( " " , "T" ).replace( "/" , "-" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
입력 문자열과 같은 LocalDateTime
에는 표준 시간대 또는 UTC로부터 오프셋 개념이 없습니다. 표준 시간대/오프셋의 컨텍스트가 없으면 LocalDateTime
은 실제 의미가 없습니다. 인도, 유럽 또는 캐나다에서 오후 6시 10분인가요? 각 지역에서는 타임라인의 다른 지점에서 다른 순간에 오후 6시 10분을 경험합니다. 따라서 타임라인에서 특정 시점을 결정하려면 염두에 두고 있는 시점을 지정해야 합니다.
ZoneId z = ZoneId.of( "Europe/Oslo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
이제 ZonedDateTime
에 특정 순간이 있습니다. 인스턴트를 추출하여 UTC로 변환합니다. 인스턴트
](http://docs.oracle.com/javase/10/docs/api/java/time/Instant.html) 클래스는 타임라인의 한 순간을 나노초의 해상도(소수점 아홉 자리까지)로 나노초로 나타냅니다.
Instant instant = zdt.toInstant() ;
이제 1970년 첫 순간(UTC, 1970-01-01T00:00Z)의 에포크 기준부터 원하는 밀리초 수를 얻을 수 있습니다.
long millisSinceEpoch = instant.toEpochMilli() ;
java.time 정보
java.time](http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html) 프레임워크는 Java 8 이상에 내장되어 있습니다. 이 클래스는 java.util.Date
, Calendar
, & SimpleDateFormat
과 같은 번거로운 이전 레거시 날짜-시간 클래스를 대체합니다.
현재 유지 관리 모드에 있는 Joda-Time 프로젝트는 java.time 클래스로의 마이그레이션을 권장합니다.
자세한 내용은 오라클 튜토리얼을 참조하세요. 그리고 스택 오버플로를 검색하면 많은 예제와 설명을 볼 수 있습니다. 사양은 JSR 310입니다.
데이터베이스와 직접 java.time 객체를 교환할 수 있습니다. JDBC 4.2](http://openjdk.java.net/jeps/170) 이상과 호환되는 JDBC 드라이버를 사용하세요. 문자열이 필요 없고, java.sql.*
클래스가 필요하지 않습니다.
java.time 클래스는 어디에서 구할 수 있나요?
Interval
, YearWeek
, YearQuarter
, more 등 몇 가지 유용한 클래스를 찾을 수 있습니다.업데이트: Joda-Time 프로젝트는 현재 유지 관리 모드에 있으며, 팀에서 java.time 클래스로의 마이그레이션을 권장하고 있습니다. 이 섹션은 기록을 위해 그대로 남겨두겠습니다. 아래는 동일한 종류의 코드이지만 Joda-Time 2.5 라이브러리를 사용하고 시간대를 처리합니다. java.util.Date, .Calendar 및 .SimpleDateFormat 클래스는 번거롭고 혼란스럽고 결함이 있는 것으로 악명이 높습니다. 피하세요. Joda-Time 또는 Java 8에 내장된 java.time 패키지(Joda-Time에서 영감을 얻음)를 사용하세요.
문자열이 거의 ISO 8601 형식입니다. 슬래시는 하이픈이어야 하고 중간에 있는 스페이스는 T
로 대체해야 합니다. 이를 조정하면 포매터를 지정할 필요 없이 생성자에 결과 문자열을 직접 공급할 수 있습니다. Joda-Time은 문자열을 파싱하고 생성할 때 기본값으로 ISO 8701 형식을 사용합니다.
String inputRaw = "2014/10/29 18:10:45";
String input = inputRaw.replace( "/", "-" ).replace( " ", "T" );
DateTimeZone zone = DateTimeZone.forID( "Europe/Oslo" ); // Or DateTimeZone.UTC
DateTime dateTime = new DateTime( input, zone );
long millisecondsSinceUnixEpoch = dateTime.getMillis();
SimpleDateFormat](http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html) 클래스를 사용하면 String
을 java.util.Date
객체로 구문 분석할 수 있습니다. Date 객체가 있으면 Date.getTime()
을 호출하여 에포크 이후 밀리초를 가져올 수 있습니다.
전체 예제:
String myDate = "2014/10/29 18:10:45";
//creates a formatter that parses the date in the given format
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = sdf.parse(myDate);
long timeInMillis = date.getTime();
이렇게 하면 이중이 아닌 'long'이 나오지만, 아마 의도한 바가 그거였을 것입니다. SimpleDateFormat` 클래스에 대한 문서에는 다양한 형식을 구문 분석하도록 설정하는 방법에 대한 정보가 많이 있습니다.
2017년 는 그 답을 찾을 수 있습니다. 날짜 및 시간 클래스를 사용하여 자바 가상 머신 (jvm) 에 소개된 8 (또한 박포르테드 자바 6 과 7 의 [트리틴 박포트] (http://www.threeten.org/threetenbp/)).
스케쳐내 해석하는 날짜-시간 문자열의 컴퓨터의 시간대:
long millisSinceEpoch = LocalDateTime.parse(myDate, DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss"))
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
시간대, 칠 경우 다른 영역에 있는 조나이트리시스템데포트 () '대신'. Utc 사용할 경우,
long millisSinceEpoch = LocalDateTime.parse(myDate, DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss"))
.atOffset(ZoneOffset.UTC)
.toInstant()
.toEpochMilli();