현재 순간 (UTC)의 ISO 8601 형식 프레젠테이션 을 얻는 가장 우아한 방법은 무엇입니까 ? 다음과 같아야합니다 2010-10-12T08:50Z..
예:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
private static SimpleDateFormat것은 스레드로부터 안전하지 않습니다.
현재 순간 (UTC)의 ISO 8601 형식 프레젠테이션 을 얻는 가장 우아한 방법은 무엇입니까 ? 다음과 같아야합니다 2010-10-12T08:50Z..
예:
String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
private static SimpleDateFormat것은 스레드로부터 안전하지 않습니다.
답변:
원하는 객체 SimpleDateFormat를 포맷하는 데 사용하십시오 Date.
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
사용 a new Date()상술 한 바와 같이하여 현재 시간을 포맷한다.
"yyyy-MM-dd'T'HH:mmZ"은 ISO-8601 형식의 날짜가 필요할 때마다 응용 프로그램에 많은 인스턴스가 있어야한다는 것 입니다. 내가 본 것처럼 JodaTime을 사용하면 미리 정의 된 포맷터를 사용할 수 있습니다. ISODateTimeFormat이 기능은 저에게 도움이됩니다.
Z은 SimpleDateFormat에서 유효한 패턴입니다 yyyy-MM-dd'T'HH:mm'Z'.
기본 시간대가 UTC가 아닌 시스템의 경우 :
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
SimpleDateFormat인스턴스가 자주 필요한 경우 글로벌 상수로 선언하지만,이 클래스는 스레드 안전하지 않습니다 것을주의 할 수있다. 여러 스레드가 동시에 액세스하는 경우 동기화되어야합니다.
편집 : 많은 다른 시간 / 날짜 조작을 수행하는 경우 Joda Time을 선호합니다 ...
EDIT2 : 수정 : setTimeZone문자열을 수락하지 않습니다 (Paul에 의해 수정 됨)
2016-06-14T13:56+0000- 질문 같은 것을 요구한다2016-06-14T13:56Z
java.time 은 Java 8부터 간단합니다. 그리고 스레드 안전합니다.
ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )
결과: 2015-04-14T11:07:36.639Z
당신은 가벼운 사용하도록 유혹 할 수
Temporal와 같은Instant나LocalDateTime,하지만 그들은 지원 또는 시간 영역 데이터 포맷이 부족하다. 기본적으로 만ZonedDateTime작동합니다.
ZonedDateTime 및 DateTimeFormatter 옵션 / 작업을 조정하거나 연결하여 시간대 와 정밀도 를 어느 정도 쉽게 제어 할 수 있습니다 .
ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
.truncatedTo( ChronoUnit.MINUTES )
.format( DateTimeFormatter.ISO_DATE_TIME )
결과: 2015-04-14T11:07:00+01:00[Europe/Paris]
초 부분 제거와 같은 개선 된 요구 사항은 여전히 사용자 지정 형식 또는 사용자 지정 사후 프로세스를 통해 제공되어야합니다.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07
Java 6 & 7의 경우 Android 포트 가있는 ThreeTen-Backport 와 같은 java.time 의 백 포트를 고려할 수 있습니다 . 둘 다 Joda보다 가볍고 Joda의 경험 -esp에서 배웠습니다 . java.time이 Joda의 저자에 의해 설계되었다는 것을 고려하십시오.
ZoneId.of( "America/Montreal" ).
return DateTimeFormatter.ISO_INSTANT.format(this);
DateTimeFormatter.ISO_INSTANT과 DateTimeFormatter.ISO_DATE_TIME더 이상 봄의에 의해 선택되는 3, 반대로, 초 이후 6 자리를 사용 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME).
자바 8 :
thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
.withZone(ZoneOffset.UTC)
.format(Instant.now());
프리 자바 8 :
thisMoment = String.format("%tFT%<tRZ",
Calendar.getInstance(TimeZone.getTimeZone("Z")));
에서 워드 프로세서 :
'R'24 시간 제로 "% tH : % tM"으로 형식화 된 시간
'F'ISO 8601 완료 날짜는 "% tY- % tm- % td"로 형식화되었습니다.
DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);또는 캡슐화합니다 언제 어디서나 return String.format("%tFT%<tRZ", new Date());수업 str = Iso8601Time.now()에 참여할 수 있습니다. (ISO 형식이 변경되는 것은 아닙니다.) ISO 형식의 현재 날짜보다 더 필요한 것이 있으면 lib를 사용하십시오.
%tFT%<tTZ초를 포함합니다; %tFT%<tTZ.%<tL밀리 초가 포함됩니다.
Java 8부터 간단하게 수행 할 수 있습니다.
Instant.now().toString();
로부터 java.time.Instant문서 :
지금
public static Instant now()시스템 시계에서 현재 순간을 얻습니다.
현재 UTC 를 얻기 위해 시스템 UTC 시계 를 쿼리합니다 .
public String toString()ISO-8601 표현을 사용한이 순간의 문자열 표현.
사용 된 형식은와 동일합니다
DateTimeFormatter.ISO_INSTANT.
SimpleDateFormats.
toString많은 경우 명시 적으로 호출하지 않아도됩니다.
JodaTime 사용
ISO 8601 캘린더 시스템은 Joda-Time의 기본 구현입니다.
JodaTime Formatter에 대한 문서는 다음과 같습니다.
편집하다:
추가하고 싶지 않거나 위의 라이브러리 추가 가치가 표시되지 않으면 내장 SimpleDateFormat클래스에서 날짜를 필수 ISO 형식으로 형식화 할 수 있습니다
@Joachim Sauer가 제안한대로
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());
ISODateTimeFormatISO-8601의 미리 정의 된 포맷터를 가지고 있기 때문에 어떤 경우에도 좋습니다 .
Apache의 DateFormatUtilscommons-lang3 에는 다음과 같은 유용한 상수가 있습니다.DateFormatUtils.ISO_DATETIME_FORMAT
DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));기본 시간대의 현재 순간 : DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()); @ yegor256을 언급 해 주셔서 감사 DateFormatUtils합니다.
ISO 8601은 초를 포함 할 수 있습니다. http://en.wikipedia.org/wiki/ISO_8601#Times 참조
그래서 코드는
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
업데이트 : Joda 타임 프로젝트에 지금 유지 관리 모드 받는 마이그레이션을 조언 팀과 함께, java.time의 클래스. 자바 6 및 7의 경우, 참조 ThreeTen - 백 포트의 추가로 안드로이드에 맞게 프로젝트, ThreeTenABP의 프로젝트를.
은 Using Joda 타임 라이브러리를 ...
String output = new DateTime( DateTimeZone.UTC ).toString() ;
이것은 스레드로부터 안전합니다. Joda-Time은 기존 객체를 변경하지 않고 새로운 불변 객체를 만듭니다 .
몇 초 만에 몇 초 만에 포맷을 요청하려는 경우 Joda-Time의 다른 많은 내장 포맷터 중 하나를 사용하십시오.
DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;
Java 8 이상의 경우 Joda-Time이 계속 작동합니다. 그러나 내장 java.time 프레임 워크는 Joda-Time을 대체합니다. 따라서 가능한 빨리 코드를 Joda-Time에서 java.time으로 마이그레이션하십시오.
현대적인 솔루션에 대한 다른 답변 을 참조하십시오 .
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 더 .
Java 버전 7의 경우
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html Oracle 설명서를 따를 수 있습니다.
X-ISO 8601 시간대에 사용
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());
System.out.println(nowAsISO);
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);
System.out.println(finalResult);
ISO 8601에 대해 다음 패턴으로 Java의 SimpleDateFormat 을 사용할 수 있습니다 yyyy-MM-dd'T'HH:mm:ssXXX.
샘플 코드 : (사용 가능한 모든 시간대 목록)
for (String timeZone : TimeZone.getAvailableIDs())
{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
String formatted = dateFormat.format(new Date());
System.out.print(formatted);
if (formatted.endsWith("Z"))
{
// These time zone's have offset of '0' from GMT.
System.out.print("\t(" + timeZone + ")");
}
System.out.println();
}
당신은 사용할 수 있습니다 :
TimeZone.getDefault ()
기본 vm 시간대의 경우 여기 더
로 끝나는 일부 시간대의 날짜 시간이 표시 될 수 있습니다 'Z'. 이 시간대는 '0'GMT와 오프셋이 있습니다.
자세한 내용은 여기를 참조하십시오 .
가장 쉬운 방법은 먼저 인스턴트로 이동 한 다음 다음과 같이 문자열로 만드는 것입니다.
String d = new Date().toInstant().toString();
결과는 다음과 같습니다.
2017-09-08T12:56:45.331Z
Date개체 를 거치지 않아도됩니다 . 그냥하세요 Instant.now().toString(). Date레거시 API에서 얻은 것이 있으면 가장 좋은 방법입니다.
java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 을 참조하십시오 .
다른 답변 중 일부는 java.time 클래스 를 추천하는 것은 정확 하지만 특정 요구에 불필요한 길이를 사용합니다.
Instant.now() // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
.truncatedTo( ChronoUnit.MINUTES ) // Lop off any seconds or fractional second, to get a value in whole minutes.
.toString() // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
2018-01-23T12 : 34Z
Instant::toStringjav.time.Instant클래스는 항상 UTC에, UTC의 순간을 나타냅니다.
Instant instant = Instant.now() ;
instant.toString () : 2018-01-23T12 : 34 : 56.123456Z
Z귀하의 예제 문자열의 끝은 2010-10-12T08:50Z"줄루어"발음과 의미한다 UTC를 .
원하는 형식이 ISO 8601 표준 을 준수 합니다. java.time의 문자열을 생성 / 분석 할 때 클래스는 기본적으로 이러한 표준 형식을 사용합니다. 따라서 서식 패턴을 지정할 필요가 없습니다. Instant::toString위와 같이 전화하십시오 .
구체적으로 초 또는 초 단위가 아닌 전체 분을 원하면 자릅니다. ChronoUnit수업을 통해 시간 단위를 지정하십시오 .
Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString(); // Generate a `String` object in standard ISO 8601 format.
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 더 .
여기에 "now ()"를 호출하면 더 이상 할 일이 없도록 최적화 된 전체 클래스가 있습니다.
public class Iso8601Util
{
private static TimeZone tz = TimeZone.getTimeZone("UTC");
private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
static
{
df.setTimeZone(tz);
}
public static String now()
{
return df.format(new Date());
}
}
private static String getCurrentDateIso()
{
// Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
return dateFormat.format(new Date());
}
여전히 joda-time은 기본 형식이 아닌 "2015-12-09T00 : 22 : 42.930Z"확장 형식 만 지원합니다. "20151209T002242.930Z"... Java SimpleDateFormat을 사용하여 형식 목록을 테스트하는 것이 좋습니다.
Android에서 Calendar 및 SimpleDateFormat을 사용하여 수행했습니다. 다음 메소드는 "GMT"시간대가있는 캘린더를 반환합니다 (이것은 표준 시간대입니다). 그런 다음 Calendar 클래스의 setTimeZone () 메소드를 사용하여 Calendar 클래스를 사용하여 다른 시간대 사이의 시간을 설정할 수 있습니다.
private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";
public static Calendar isoToCalendar(final String inputDate) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
Date date = dateFormat.parse(inputDate);
calendar.setTime(date);
} catch (ParseException e) {
Log.e("TAG",e.getMessage());
}
return calendar;
}
기억하십시오 : Date 클래스는 TimeZone 존재에 대해 알지 못합니다. 따라서 하나의 날짜를 디버깅하면 항상 현재 시간대의 날짜가 표시됩니다.
성능에 관심이 있다면 ISO8601 형식의 날짜를 처리 할 때 표준 Java 파서 및 포맷터보다 우수한 라이브러리 를 만들었습니다 . DatetimeProcessor 구현은 스레드로부터 안전하며 동시 맵 또는 정적 필드에 캐시 될 수 있습니다.
<dependency>
<groupId>com.axibase</groupId>
<artifactId>date-processor</artifactId>
<version>1.0.3</version>
</dependency>
import com.axibase.date.DatetimeProcessor;
import com.axibase.date.PatternResolver;
import org.junit.Before;
import org.junit.Test;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
public class DateFormatTest {
private Clock clock;
@Before
public void prepare() {
clock = Clock.fixed(Instant.ofEpochMilli(1571285405300L), ZoneId.of("Europe/Berlin"));
}
@Test
public void testIsoMillis(){
final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10:05.300Z"));
}
@Test
public void testIsoMillisLocalZone(){
final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
assertThat(formatter.print(clock.millis(), clock.getZone()), is("2019-10-17T06:10:05.300+02:00"));
}
@Test
public void testIsoMinutes(){
final DatetimeProcessor formatter = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX");
assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10Z"));
}
}
DateTimeFormatter.ISO_DATE_TIME
.withZone(ZoneOffset.UTC)
.format(yourDateObject.toInstant())
이 시도,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
String date=sdf.format (new Date() );
ISO 8601 형식