Java 시간대를 GMT/UTC로 강제 적용
기계에 설정된 시간대에 관계없이 GMT/UTC에 관련된 작업을 강제로 수행해야 합니다.암호로 그렇게 할 수 있는 편리한 방법이 있나요?
명확히 하기 위해 DB 서버 시간은 모든 작업에 사용하지만, 로컬 시간대에 따라 형식이 지정됩니다.
감사합니다!
는 이 실행 하고 JVM의 기본 합니다.user.timezone다음 중 하나:
java -Duser.timezone=GMT ... <main-class>
에서 Date할 때 가 있는 ResultSet의 두 인 을 getXXX「」를 Calendar★★★★★★★★★★★★★★★★★★:
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
Date dateValue = rs.getDate("DateColumn", tzCal);
// Other fields and calculations
}
또는 Prepared Statement에서 날짜를 설정합니다.
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
PreparedStatement ps = conn.createPreparedStatement("update ...");
ps.setDate("DateColumn", dateValue, tzCal);
// Other assignments
ps.executeUpdate();
그러면 데이터베이스 컬럼이 시간대 정보를 유지하지 않을 때 데이터베이스에 저장된 값이 일관되게 유지됩니다.
java.util.Date ★★★★★★★★★★★★★★★★★」java.sql.Date는 UTC.class에 시간밀리초)을 UTC로 합니다.하려면 , 「Da」를 합니다.SimpleDateFormatCalendar 객체를 사용하여 타임존을 값에 연관지을 수도 있습니다.
TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);
유용한 참조
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
또, JVM 타임 존을 이 방법으로 설정할 수 있는 경우.
System.setProperty("user.timezone", "EST");
★★★★★★★★★★★★★★★★★」-Duser.timezone=GMTJVM args 。
TimeZone.setDefault()를 사용하여 시간대를 변경할 수 있습니다.
TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
Windows 2003 Server에서는 항상 새로운 Date()의 GMT가 반환되기 때문에 JVM 타임존을 설정할 필요가 있었습니다.
-Duser.timezone=America/Los_Angeles
또는 적절한 시간대를 지정합니다.시간대 목록을 찾는 것도 좀 어렵긴 했지만...
다음은 두 가지 목록입니다.
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
dr;dr
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
기본 시간대를 호스트 OS 또는 JVM에 의존하지 않음
원하는/예상 시간대를 명시하기 위해 모든 코드를 작성할 것을 권장합니다.JVM의 현재 기본 시간대에 의존할 필요는 없습니다.또한 JVM의 현재 기본 시간대는 런타임 중 언제든지 변경될 수 있으며, 모든 앱 호출의 스레드에 코드가 포함되어 있습니다.TimeZone.setDefault이러한 호출은 해당 JVM 내의 모든 앱에 즉시 영향을 미칩니다.
java.time
다른 답변 중 일부는 맞았지만 지금은 구식이 되었습니다.초기 버전의 Java에 번들된 끔찍한 날짜 시간 클래스는 결함이 있으며, 날짜 시간 처리의 복잡성과 미묘함을 이해하지 못하는 사람들에 의해 작성되었습니다.
레거시 date-time 클래스는 JSR 310에서 정의된 java.time 클래스로 대체되었습니다.
타임 존을 나타내려면 , 를 사용합니다.UTC로부터의 오프셋을 나타내려면 , 를 사용합니다.오프셋은 본초 자오선보다 불과 몇 시간 앞 또는 뒤에 있습니다.시간대는 훨씬 더 많다.타임존은 특정 지역 사람들이 사용하는 오프셋에 대한 과거, 현재 및 미래의 변경 이력입니다.
GMT/UTC에 관련된 작업을 강제로 수행해야 합니다.
오프셋이 0 시간 분인 경우는, 상수를 사용합니다.
Instant
순간을하려면 UTC를 합니다.Instant이 클래스는 UTC로 시간을 나타내며 정의상 항상 UTC로 시간을 나타냅니다.
Instant instant = Instant.now() ; // Capture current moment in UTC.
ZonedDateTime
특정 지역 사람들이 사용하는 벽시계 시간을 통해 동일한 순간을 보려면 시간대로 조정하십시오.같은 순간, 시간대의 같은 지점, 다른 벽시계.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
데이터베이스
데이타베이스에 대해 언급했군요.
를 취득하려면 "" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "SQL" "" "SQL" "" "SQL" ""TIMESTAMP WITH TIME ZONE. 문자열이 아닌 객체를 가져옵니다.JDBC 4.2 이후에서는 데이터베이스와 java.time 객체를 교환할 수 있습니다.그OffsetDateTime는 JDBC에단, JDBC는Instant&ZonedDateTime션입니니다다
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
대부분의 데이터베이스와 드라이버에서 UTC와 같은 순간을 얻을 수 있을 것입니다.그러나 그렇지 않은 경우 다음 두 가지 방법 중 하나로 조정할 수 있습니다.
Instantodt.toInstant()- 지정된 오프셋에서 오프셋 0으로 조정합니다. OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset).UTC );.
java.time 정보
java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.
자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.
현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.
java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후에 준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*반.
java.time 클래스는 어디서 얻을 수 있습니까?
- 자바 SE 8, 자바 SE 9, 자바 SE 10, 자바 SE 11 및 이후 - 표준 Java API의 일부이며 번들 구현이 포함되어 있습니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되어 있습니다.
- 자바 SE 6 및 자바 SE 7
- java.time 기능의 대부분은 ThreeTen 백포트의 Java 6 및7로 백포트됩니다.
- 안드로이드
- 최신 버전의 Android 번들 구현 java.time 클래스.
- 이전의 Android(<26)에서는 쓰리텐ABP 프로젝트가 ThreeTen-Backport(상기)를 채택하고 있습니다.'쓰리텐ABP 사용방법'을 참조하십시오.
저는 간단한 SimpleDateFormat만 있으면 됩니다.
private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd");
static {
GMT.setTimeZone(TimeZone.getTimeZone("GMT"));
SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
}
다른 표준 시간대로 날짜 형식을 지정합니다.
시스템 속성 사용:
-Duser.timezone=UTC
DB에서 시간을 raw 형식(긴 타임스탬프 또는 java의 날짜)으로 가져온 다음 SimpleDateFormat을 사용하여 포맷하거나 Calendar를 사용하여 조작합니다.두 경우 모두 개체를 사용하기 전에 시간대를 설정해야 합니다.
봐SimpleDateFormat.setTimeZone(..)그리고.Calendar.setTimeZone(..)자세한 것은
클라이언트/서버 쌍을 생성하여 실행 후 클라이언트 서버가 올바른 시간과 날짜를 전송하도록 합니다.그런 다음 클라이언트는 서버에 PM GMT를 요청하고 서버는 응답 권한을 반환합니다.
MySQL에서 다음 행을 실행하여 시간대를 재설정합니다.
SET @@global.time_zone = '+00:00';
와, 오래된 스레드인 것은 알지만, 사용자 레벨의 코드로 TimeZone.setDefault()를 호출하지 않는 것밖에 할 수 없습니다.이는 항상 전체 JVM의 타임존을 설정하기 때문에 거의 항상 매우 좋지 않은 생각입니다.Java 8의 joda.time 라이브러리 또는 joda.time 라이브러리와 매우 유사한 새로운 DateTime 클래스를 사용하는 방법을 배우십시오.
아래 코드가 도움이 되길 바랍니다.
DateFormat formatDate = new SimpleDateFormat(ISO_DATE_TIME_PATTERN);
formatDate.setTimeZone(TimeZone.getTimeZone("UTC"));
formatDate.parse(dateString);
intiger로만 GMT 시간을 가져오려면 var currentTime = new Date(); var currentYear = '2010' var currentMonth = 10; var currentDay = '30' var current current시간 ='20' var currentMinutes ='20' var currentSeconds ='00' var currentMilliseconds ='00'
currentTime.setFullYear(currentYear);
currentTime.setMonth((currentMonth-1)); //0is January
currentTime.setDate(currentDay);
currentTime.setHours(currentHours);
currentTime.setMinutes(currentMinutes);
currentTime.setSeconds(currentSeconds);
currentTime.setMilliseconds(currentMilliseconds);
var currentTimezone = currentTime.getTimezoneOffset();
currentTimezone = (currentTimezone/60) * -1;
var gmt ="";
if (currentTimezone !== 0) {
gmt += currentTimezone > 0 ? ' +' : ' ';
gmt += currentTimezone;
}
alert(gmt)
언급URL : https://stackoverflow.com/questions/2627992/force-java-timezone-as-gmt-utc
'programing' 카테고리의 다른 글
| Vue 3: 메서드 함수에서 상태에 액세스하는 방법 (0) | 2023.01.24 |
|---|---|
| php에서 어레이 값의 공백을 잘라내는 방법 (0) | 2023.01.24 |
| NumPy 어레이에 열을 추가하려면 어떻게 해야 합니까? (0) | 2023.01.24 |
| 다음 클래스를 인스턴스화할 수 없습니다. - Android.support.v7.199.툴바 (0) | 2023.01.24 |
| 스위트에서 하나의 테스트만 실행하려면 어떻게 해야 합니까? (0) | 2023.01.24 |
