java.util.Date의 표준 시간대를 설정하는 방법
나는 해석해 본 적이 있습니다 구문 분석하고 있다.java.util.Date
한 에서에서String
하지만설정하고 있습니다 로컬타임존으로는로컬 타임존을의 시간 지역의 지역 시간대를 설치하는 것이다.date
물건.물건.
시간대있지 않습니다 지정되어는타임존은 에에 지정되지 않는다.String
는 거기서부터에서Date
구문 분석된다.해석됩니다. 나는특정 시간대를 설정하고 싶다의 특정 시간대 제시하고 싶다.date
물건.물건.
내가 어떻게 그럴 수 있을까?
DateFormat을 사용합니다.예를들면,
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = isoFormat.parse("2010-05-23T09:01:02");
조심하라가 주의해 주세요java.util.Date
개체는 스스로-오브젝트 자체에는 타임존 정보가포함되어 있지 않습니다에 timezone을 설정할 수 없는 timezone 정보가 포함되지 않는다.이 경우 타임존을 설정할 수 없습니다.Date
물건.물건.a가 유일하게는 유일한 것.Date
는 1970년 UTC.object에 1월 1일 00:00:00 UTC가 포함된 의 밀리초 수입니다.
나타나듯이 ZZ Coder에 을 합니다.DateFormat
object:를 지정합니다.object: 날 object 、 object object object object object 。
dr;dr
…문자열에서 해석…타임존이 지정되지 않음…특정 타임존을 설정하고 싶다.
LocalDateTime.parse( "2018-01-23T01:23:45.123456789" ) // Parse string, lacking an offset-from-UTC and lacking a time zone, as a `LocalDateTime`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign the time zone for which you are certain this date-time was intended. Instantiates a `ZonedDateTime` object.
j.u.에는 타임존이 없습니다.날짜.
다른 정답은 java.util입니다.날짜에는 표준 시간대가† 없습니다.UTC/GMT(타임존 오프셋 없음)를 나타냅니다.매우 혼란스럽다 왜냐하면toString
method string String 、 JVM の method method method 。
J.U.를 피하세요.날짜.
이러한 이유 및 기타 여러 가지 이유로 기본 제공 java.util을 사용하지 마십시오.Date & . Calendar & java . text 。SimpleDateFormat.그들은 귀찮기로 악명 높다.
대신 Java 8에 번들된 java.time 패키지를 사용합니다.
java.time
java.time 클래스는 타임라인상의 순간을 다음 3가지 방법으로 나타낼 수 있습니다.
- UTC)
Instant
) - ( 「 」 「 。
OffsetDateTime
ZoneOffset
) - 「 」 )가 있는 경우
ZonedDateTime
ZoneId
)
Instant
java.time에서 기본 빌딩 블록은 UTC의 타임라인상의 모멘트입니다.사용하다Instant
비즈니스 논리 중 많은 부분을 대상으로 합니다.
Instant instant = Instant.now();
OffsetDateTime
UTC로부터의 오프셋을 적용하여 일부 지역의 벽 클럭 시간으로 조정합니다.
를 적용하여를 취득합니다.
ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );
ZonedDateTime
표준 시간대, 오프셋 및 Daylight Saving Time(DST; 일광 절약 시간) 등의 이상 현상을 처리하는 규칙을 적용하는 것이 좋습니다.
를 에 적용하다Instant
항상 적절한 시간대 이름을 지정하십시오.다음과 같은 3~4개의 약어를 사용하지 마십시오.EST
★★★★★★★★★★★★★★★★★」IST
독특하지도 않고 표준적이지도 않다.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
LocalDateTime
입력 문자열에 오프셋 또는 존 인디케이터가 없는 경우 로 해석합니다.
는, 「」를 합니다.ZoneId
을 생산하다ZonedDateTime
. 상단의 tl;dr 섹션의 코드 예를 참조하십시오.
포맷된 문자열
" "에 주세요.toString
메서드를 사용하여 표준 ISO 8601 형식으로 날짜-시간 값을 나타내는 문자열을 생성합니다.그ZonedDateTime
는 표준 하기 위해 각괄호 안에 합니다.class . class class 、 class 、 class 、 class class class class 。
String outputInstant = instant.toString(); // Ex: 2011-12-03T10:15:30Z
String outputOdt = odt.toString(); // Ex: 2007-12-03T10:15:30+01:00
String outputZdt = zdt.toString(); // Ex: 2007-12-03T10:15:30+01:00[Europe/Paris]
다른 형식의 경우 클래스를 사용합니다.일반적으로 해당 클래스가 사용자의 예상 언어 및 문화 규범을 사용하여 현지화된 형식을 생성할 수 있도록 하는 것이 좋습니다.또는 특정 형식을 지정할 수 있습니다.
java.time 정보
java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.
자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.
현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.
java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후에 준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*
반.휴지 상태 5 및 JPA 2.2는 java.time을 지원합니다.
java.time 클래스는 어디서 얻을 수 있습니까?
- 자바 SE 8, 자바 SE 9, 자바 SE 10, 자바 SE 11 및 이후 - 표준 Java API의 일부이며 번들 구현이 포함되어 있습니다.
- 자바 9는 몇 가지 사소한 기능과 수정을 제공했습니다.
- 자바 SE 6 및 자바 SE 7
- java.time 기능의 대부분은 ThreeTen 백포트의 Java 6 및7로 백포트됩니다.
- 안드로이드
- 최신 버전의 Android(26+) 번들 구현 java.time 클래스.
- 이전의 Android(<26)에서는 API 디스카어링이라고 하는 프로세스가 원래 Android에 내장되어 있지 않은 java.time 기능의 서브셋을 가져옵니다.
- 디스거링이 필요한 기능을 제공하지 않는 경우 쓰리텐ABP 프로젝트는 ThreeTen-Backport(상기)를 Android에 적용합니다.'쓰리텐ABP 사용방법'을 참조하십시오.
조다 타임
Joda-Time은 아직 적극적으로 유지되고 있지만, 제조사로부터 가능한 한 빨리 java.time으로 이행하라고 들었습니다.이 섹션은 그대로 참고용으로 남겨두지만java.time
를 참조해 주세요.
Joda-Time에서 날짜-시간 개체()DateTime
는 할당된 시간대를 실제로 알고 있습니다.즉, UTC 및 해당 시간대의 DST(Daylight Saving Time) 규칙과 이력에 대한 오프셋 및 기타 이상 징후를 의미합니다.
String input = "2014-01-02T03:04:05";
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeIndia = new DateTime( input, timeZone );
DateTime dateTimeUtcGmt = dateTimeIndia.withZone( DateTimeZone.UTC );
" "에 주세요.toString
ISO 8601 형식의 문자열을 생성하는 방법.
String output = dateTimeIndia.toString();
또한 Joda-Time은 모든 종류의 String 형식을 생성할 수 있는 풍부한 기능을 제공합니다.
필요한 경우 Joda-Time DateTime에서 java.util로 변환할 수 있습니다.날짜.
Java.util.Date date = dateTimeIndia.toDate();
StackOverflow에서 "joda date"를 검색하여 더 많은 예를 찾을 수 있습니다.상세한 예도 있습니다.
†실제로 java.util에는 타임존이 포함되어 있습니다.날짜, 일부 내부 기능에 사용됩니다(이 답변의 주석 참조).그러나 이 내부 시간대는 속성으로 노출되지 않으므로 설정할 수 없습니다.이 내부 타임존은 날짜 시간 값의 문자열 표현을 생성할 때 메서드에 의해 사용되는 타임존이 아닙니다.대신 JVM의 현재 기본 타임존이 즉시 적용됩니다.그래서 줄여서 우리는 종종 "j.u."라고 말한다.날짜에는 표준 시간대가 없습니다."헷갈려요?네, 하지만 이 피곤한 옛 수업을 피해야 하는 또 다른 이유가 있습니다.
JVM 레벨로 타임존을 설정할 수도 있습니다.
Date date1 = new Date();
System.out.println(date1);
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
// or pass in a command line arg: -Duser.timezone="UTC"
Date date2 = new Date();
System.out.println(date2);
출력:
Thu Sep 05 10:11:12 EDT 2013
Thu Sep 05 14:11:12 UTC 2013
표준 JDK 클래스만 사용해야 하는 경우 다음을 사용할 수 있습니다.
/**
* Converts the given <code>date</code> from the <code>fromTimeZone</code> to the
* <code>toTimeZone</code>. Since java.util.Date has does not really store time zome
* information, this actually converts the date to the date that it would be in the
* other time zone.
* @param date
* @param fromTimeZone
* @param toTimeZone
* @return
*/
public static Date convertTimeZone(Date date, TimeZone fromTimeZone, TimeZone toTimeZone)
{
long fromTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, fromTimeZone);
long toTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, toTimeZone);
return new Date(date.getTime() + (toTimeZoneOffset - fromTimeZoneOffset));
}
/**
* Calculates the offset of the <code>timeZone</code> from UTC, factoring in any
* additional offset due to the time zone being in daylight savings time as of
* the given <code>date</code>.
* @param date
* @param timeZone
* @return
*/
private static long getTimeZoneUTCAndDSTOffset(Date date, TimeZone timeZone)
{
long timeZoneDSTOffset = 0;
if(timeZone.inDaylightTime(date))
{
timeZoneDSTOffset = timeZone.getDSTSavings();
}
return timeZone.getRawOffset() + timeZoneDSTOffset;
}
이 직책의 공적은 이 직책이다.
java.util.Calendar
는 JDK 클래스만을 사용하여 표준 시간대를 처리하는 일반적인 방법입니다.Apache Commons에는 도움이 될 수 있는 몇 가지 추가 대체/유틸리티가 있습니다.Edit Sponge의 노트는 Joda-Time에 대해 좋은 말을 많이 들었음을 상기시켜 주었습니다(자신은 사용하지 않았지만).
여기서 "2020-03-11T20:16:17"과 같은 날짜를 가져오고 "11/3/2020-20:16"을 반환할 수 있습니다.
private String transformLocalDateTimeBrazillianUTC(String dateJson) throws ParseException {
String localDateTimeFormat = "yyyy-MM-dd'T'HH:mm:ss";
SimpleDateFormat formatInput = new SimpleDateFormat(localDateTimeFormat);
//Here is will set the time zone
formatInput.setTimeZone(TimeZone.getTimeZone("UTC-03"));
String brazilianFormat = "dd/MMM/yyyy - HH:mm";
SimpleDateFormat formatOutput = new SimpleDateFormat(brazilianFormat);
Date date = formatInput.parse(dateJson);
return formatOutput.format(date);
}
날짜를 문자열로 변환하고 SimpleDateFormat을 사용합니다.
SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
readFormat.setTimeZone(TimeZone.getTimeZone("GMT" + timezoneOffset));
String dateStr = readFormat.format(date);
SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
Date date = writeFormat.parse(dateStr);
이 코드는 현재 작업 중인 앱에서 도움이 되었습니다.
Instant date = null;
Date sdf = null;
String formatTemplate = "EEE MMM dd yyyy HH:mm:ss";
try {
SimpleDateFormat isoFormat = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss");
isoFormat.setTimeZone(TimeZone.getTimeZone(ZoneId.of("US/Pacific")));
sdf = isoFormat.parse(timeAtWhichToMakeAvailable);
date = sdf.toInstant();
} catch (Exception e) {
System.out.println("did not parse: " + timeAtWhichToMakeAvailable);
}
LOGGER.info("timeAtWhichToMakeAvailable: " + timeAtWhichToMakeAvailable);
LOGGER.info("sdf: " + sdf);
LOGGER.info("parsed to: " + date);
한 사람이 만약 하다면,XMLGregorianCalendar
UTC에서 이을 UTC로 만 하면 됩니다.0
전화하세요.toGregorianCalendar()
되지만 - 시간대는 입니다.Date
데이터를 변환하는 방법을 알고 있기 때문에 거기서 데이터를 얻을 수 있습니다.
XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(
((GregorianCalendar)GregorianCalendar.getInstance());
xmlStartTime.setTimezone(0);
GregorianCalendar startCalendar = xmlStartTime.toGregorianCalendar();
Date startDate = startCalendar.getTime();
XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(startCalendar);
xmlStartTime.setHour(startDate.getHours());
xmlStartTime.setDay(startDate.getDate());
xmlStartTime.setMinute(startDate.getMinutes());
xmlStartTime.setMonth(startDate.getMonth()+1);
xmlStartTime.setTimezone(-startDate.getTimezoneOffset());
xmlStartTime.setSecond(startDate.getSeconds());
xmlStartTime.setYear(startDate.getYear() + 1900);
System.out.println(xmlStartTime.toString());
결과:
2015-08-26T12:02:27.183Z
2015-08-26T14:02:27.183+02:00
이 답변은 아마도 가장 짧고 날짜 클래스만 사용합니다.
long current = new Date().getTime() + 3_600_000; //e.g. your JVM time zone +1 hour (3600000 milliseconds)
System.out.printf("%1$td.%1$tm.%1$tY %1$tH:%1$tM\n", current);//european time format
하지만 가능하다면, 같은 일을 하기 위해 좀 더 현대적인 방법을 사용하세요.
언급URL : https://stackoverflow.com/questions/2891361/how-to-set-time-zone-of-a-java-util-date
'programing' 카테고리의 다른 글
Vuex의 액션이 약속을 반환하는 이유는 무엇입니까? (0) | 2022.08.18 |
---|---|
입력 상자 문자열이 상자 크기보다 길면 Vue Sortable + Draggable이 작동하지 않음 (0) | 2022.08.18 |
Eclipse에서 다중 줄 Java 문자열 붙여넣기 (0) | 2022.08.18 |
왜 선생님이 쓴 모든 C파일이 첫 줄에 #하나로 시작하나요? (0) | 2022.08.16 |
계산된 속성을 효과적으로 사용하는 Vue (0) | 2022.08.16 |