programing

java.util.Date의 표준 시간대를 설정하는 방법

newsource 2022. 8. 18. 23:42

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에 을 합니다.DateFormatobject:를 지정합니다.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(타임존 오프셋 없음)를 나타냅니다.매우 혼란스럽다 왜냐하면toStringmethod 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)
  • ( 「 」 「 。OffsetDateTimeZoneOffset)
  • 「 」 )가 있는 경우ZonedDateTimeZoneId)

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


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 클래스는 어디서 얻을 수 있습니까?


조다 타임

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 );

" "에 주세요.toStringISO 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);

한 사람이 만약 하다면,XMLGregorianCalendarUTC에서 이을 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