programing

Java 시간대를 GMT/UTC로 강제 적용

goodjava 2023. 1. 24. 08:12

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

http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm

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(레거시 및 현대) 및 표준 SQL 날짜 유형 표


java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.

java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*반.

java.time 클래스는 어디서 얻을 수 있습니까?

저는 간단한 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