วิธีตั้งค่าเขตเวลาของ java.util.Date?


225

ฉันแยกวิเคราะห์java.util.Dateจาก a แล้วStringแต่เป็นการตั้งค่าเขตเวลาท้องถิ่นเป็นเขตเวลาของdateวัตถุ

โซนเวลาที่ไม่ได้ระบุไว้ในStringจากการที่Dateจะแยก ฉันต้องการตั้งค่าเขตเวลาเฉพาะของdateวัตถุ

ฉันจะทำสิ่งนั้นได้อย่างไร


8
แม้ว่าจะไม่ได้คำตอบสำหรับคำถามของคุณฉันใช้ Joda Time หลังจากเห็นมันพูดถึงที่นี่สองสามครั้ง ดูเหมือนว่ามีเหตุผลสำหรับฉันมากกว่า API มาตรฐานและสามารถทำสิ่งนี้ได้ค่อนข้างง่าย
clstrfsck

2
@msandiford ทุกวันนี้ใช้คลาสjava.timeแทน Joda-Time Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาด้วยทีมงานให้คำปรึกษาการโยกย้ายไปยังjava.timeชั้นเรียน ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบ:


315

ใช้ 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");

6
หากวันที่สร้างขึ้นจากคลาสปฏิทินคุณสามารถตั้งค่าเขตเวลาสำหรับปฏิทิน
lwpro2

19
@ lwpro2 คำสั่งนั้นทำให้เข้าใจผิด; คุณสามารถตั้งค่าเขตเวลาสำหรับวัตถุปฏิทินได้ แต่การรับวัตถุวันที่จากมันโดยใช้เมธอด getTime () จะส่งคืนวัตถุวันที่ด้วยเขตเวลาของคอมพิวเตอร์โฮสต์
BrDaHa

ฉันมีปัญหาในการแยกวิเคราะห์ 02/20/15 14:44 ทุกคนสามารถช่วยได้
MS

@BrDaHa ถูกต้องคุณจะต้องTimeZone.setDefault()โทรก่อนgetTime()เพื่อที่วัตถุวันที่ใหม่จะอยู่ในเขตเวลาที่คุณต้องการ ใน JDK 1.8 เรียกCalendar.getTime() return new Date(getTimeInMillis());
jpllosa

182

โปรดระวังว่าjava.util.Dateวัตถุไม่มีข้อมูลเขตเวลาด้วยตนเอง - คุณไม่สามารถตั้งค่าเขตเวลาบนDateวัตถุได้ สิ่งเดียวที่Dateวัตถุมีจำนวนมิลลิวินาทีนับตั้งแต่ "ยุค" - 1 มกราคม 1970, 00:00:00 UTC

เมื่อ ZZ Coder แสดงขึ้นคุณตั้งเขตเวลาบนDateFormatวัตถุเพื่อบอกเขตเวลาที่คุณต้องการแสดงวันที่และเวลา


77
หลังจาก Googling ทดลองและ expleting ฉันได้ตระหนักในเรื่องนี้เป็นยังแม่นยำและเป็นประโยชน์กับคำตอบ - และคุ้มค่าเน้น: วันเท่านั้นประกอบด้วยค่ามิลลิวินาที ถ้าคุณมองไปที่แหล่งที่มามีสวยมากเพียงข้อมูลที่เรียกว่าlong ใช้จริงเพื่อตีความเวลามิลลิวินาทีนี้ ดังนั้นการพิมพ์ a ทำให้ดูเหมือนจะมีเขตเวลา (ค่าเริ่มต้น) นำไปสู่คำถามที่เข้าใจได้เกี่ยวกับวิธีตั้งค่าเขตเวลานั้น fastTimeDate.toString()CalendarDate
David Carboni

3
มีข้อมูลเขตเวลาภายในวัตถุวันที่ แต่มันอาจเป็นจริงคุณไม่สามารถเปลี่ยนได้
lwpro2

3
@ Iwpro2, Jesper อ้างสิทธิ์ (และฉันเห็นด้วย) ว่าวัตถุ Date ไม่ได้จัดเก็บเขตเวลา หากคุณอ้างว่าเขตเวลาถูกเก็บไว้ใน java.util.Date โปรดให้ข้อมูลอ้างอิง
จิม

6
@Jim นี่คือซอร์สโค้ดสำหรับ java.util.Date มันมี fastTime เป็นยุคยูนิกซ์เช่นเดียวกับ BaseCalendar.Date cdate ที่ใช้เพื่อสนับสนุน fastTime หากมีการกำหนดไว้ อันนั้นมีข้อมูลเขตเวลา ฉันเข้าใจว่าอินสแตนซ์ Date สามารถมีข้อมูลเขตเวลาได้ แต่อาจไม่
eis

2
@ จิมฉันไม่ได้บอกว่าคุณสามารถตั้งค่าได้ฉันบอกว่ามันมีข้อมูลนี้ ฉันไม่เห็นวิธีการตั้งค่าใด ๆ ในฐานะผู้ใช้ ฉันคิดว่า OP นั้นถูกต้องซึ่งดูเหมือนว่าจะเป็นเขตเวลาเริ่มต้นของผู้ใช้ / ระบบ
eis

95

TL; DR

…ไม่ได้ระบุ…แยกวิเคราะห์…จาก String …เขตเวลา…ฉันต้องการตั้งค่าเขตเวลาเฉพาะ

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.

ไม่มีเขตเวลาใน juDate

ในฐานะที่เป็นคำตอบที่ถูกต้องอื่น ๆ ที่ระบุไว้เป็น java.util.Date มีโซนเวลา† เพราะมันหมายถึงUTC / GMT (ไม่มีการชดเชยโซนเวลา) สับสนมากเพราะtoStringวิธีนี้ใช้โซนเวลาเริ่มต้นของ JVM เมื่อสร้างการแทนค่าสตริง

หลีกเลี่ยง juDate

ด้วยเหตุผลนี้และอีกหลายเหตุผลคุณควรหลีกเลี่ยงการใช้ java.util.Date & .Calendar ในตัว & java.text.SimpleDateFormat พวกเขามีปัญหาอย่างฉาวโฉ่

ใช้แพ็คเกจ java.time ที่มาพร้อมกับJava 8แทน

java.time

คลาส java.time สามารถแสดงช่วงเวลาบนไทม์ไลน์ได้สามวิธี:

  • UTC ( Instant)
  • ด้วยการชดเชย ( OffsetDateTimeพร้อมZoneOffset)
  • ด้วยเขตเวลา ( ZonedDateTimeพร้อมZoneId)

Instant

ในjava.time Building Blockพื้นฐานคือInstantหนึ่งช่วงเวลาบนเส้นเวลาใน UTC ใช้Instantวัตถุสำหรับตรรกะทางธุรกิจส่วนใหญ่ของคุณ

Instant instant = Instant.now();

OffsetDateTime

ใช้การชดเชยจาก UTCที่จะปรับลงในท้องที่บางเวลาผนังนาฬิกา

สมัครที่จะได้รับZoneOffsetOffsetDateTime

ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , zoneOffset );

ZonedDateTime

ที่ดีคือการใช้โซนเวลาการชดเชยบวกกฎสำหรับการจัดการความผิดปกติเช่นปรับเวลาตามฤดูกาล (DST)

ใช้ZoneIdกับผู้ที่จะได้รับInstant ZonedDateTimeระบุชื่อโซนเวลาที่ถูกต้องเสมอ ห้ามใช้ตัวย่อ 3-4 ตัวเช่นESTหรือISTที่ไม่ซ้ำกันหรือไม่เป็นมาตรฐาน

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

LocalDateTime

LocalDateTimeหากสายป้อนขาดบ่งชี้ของการชดเชยหรือโซนแยกเป็นใด ๆ

หากคุณเป็นหนึ่งของโซนเวลาที่ตั้งใจไว้กำหนดในการผลิตZoneId ZonedDateTimeดูตัวอย่างโค้ดด้านบนในส่วนtl; drที่ด้านบน

การจัดรูปแบบสตริง

เรียกใช้toStringเมธอดของคลาสทั้งสามนี้เพื่อสร้าง String ที่แทนค่าวันที่และเวลาในรูปแบบISO 8601 มาตรฐาน ZonedDateTimeระดับขยายรูปแบบมาตรฐานโดยต่อท้ายชื่อของโซนเวลาในวงเล็บ

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]

สำหรับรูปแบบอื่นให้ใช้DateTimeFormatterคลาสนี้ โดยทั่วไปแล้วดีที่สุดที่จะให้คลาสนั้นสร้างรูปแบบที่มีการแปลโดยใช้ภาษามนุษย์และบรรทัดฐานทางวัฒนธรรมที่คาดหวังของผู้ใช้ หรือคุณสามารถระบุรูปแบบเฉพาะ


ตารางประเภทวันที่และเวลาใน Java ทั้งทันสมัยและดั้งเดิม


เกี่ยวกับjava.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, และCalendarSimpleDateFormat

Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310

คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องใช้สตริงไม่จำเป็นต้องมีjava.sql.*คลาส

จะรับคลาส java.time ได้ที่ไหน?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11และใหม่กว่า - ส่วนหนึ่งของ Java API มาตรฐานที่มีการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ Java SE 7
    • ส่วนใหญ่ของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย


Joda เวลา

ในขณะที่Joda-Timeยังคงได้รับการบำรุงรักษาอย่างแข็งขันผู้ผลิตบอกให้เราย้ายไปยัง java.time ทันทีที่สะดวก ฉันปล่อยให้ส่วนนี้เป็นข้อมูลอ้างอิง แต่ฉันแนะนำให้ใช้java.timeส่วนด้านบนแทน

ในJoda-Timeวัตถุวันที่ ( DateTime) จะทราบเขตเวลาที่กำหนดอย่างแท้จริง นั่นหมายถึงการชดเชยจาก UTC และกฎและประวัติของ Daylight Saving Time (DST) ของเขตเวลาและความผิดปกติอื่น ๆ

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วิธีการสร้าง String ในรูปแบบISO 8601

String output = dateTimeIndia.toString();

Joda-Time ยังมีความสามารถมากมายสำหรับการสร้างรูปแบบสตริงอื่น ๆ ทุกประเภท

หากจำเป็นคุณสามารถแปลงจาก Joda-Time DateTime เป็น java.util.Date

Java.util.Date date = dateTimeIndia.toDate();

ค้นหา StackOverflow สำหรับ "joda date" เพื่อหาตัวอย่างอื่น ๆ อีกมากมายบางรายละเอียดค่อนข้างมาก


จริงมีเป็นโซนเวลาที่ฝังอยู่ใน java.util.Date ใช้สำหรับฟังก์ชั่นบางอย่างภายใน (ดูความคิดเห็นเกี่ยวกับคำตอบนี้) แต่เขตเวลาภายในนี้จะไม่ถูกเปิดเผยเป็นคุณสมบัติและไม่สามารถตั้งค่าได้ เขตเวลาภายในนี้ไม่ใช่โซนที่ใช้โดยtoStringวิธีการในการสร้างการแสดงสตริงของค่าวันที่และเวลา แทนเขตเวลาเริ่มต้นปัจจุบันของ JVM จะถูกนำไปใช้กับ on-the-fly แทน ดังนั้นตามที่จดชวเลขเรามักจะพูดว่า "juDate ไม่มีโซนเวลา" ทำให้เกิดความสับสน? ใช่. ยังเป็นอีกเหตุผลหนึ่งที่จะหลีกเลี่ยงคลาสเก่าเหล่านี้ที่เหนื่อยล้า


3
"ไม่มีเขตเวลาใน juDate" ผิด มีข้อมูลเขตเวลาใน juDate ที่เก็บไว้ในBaseCalendar.Date cdateคุณสมบัติหากตั้งไว้ ลองดูที่รหัสแหล่งที่มาที่นี่ คุณไม่สามารถตั้งเขตเวลาของวัตถุ juDate ที่ยกเว้นโดยการเปลี่ยนเขตเวลาเริ่มต้นของ JVM TimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));โดยการเรียก ดังนั้นจึงมีการชดเชยเขตเวลาและคุณสามารถรับการชดเชยได้ด้วยการเรียกวิธีการที่เลิกใช้แล้ว juDate.getTimezoneOffset ()
Thai Bui

3
@blquythai ถูกต้องคุณทำการบ้าน อย่างที่ฉันเคยเห็นซอร์สโค้ดนั้นมาก่อน มีเป็นโซนเวลาที่ถูกฝังอยู่ในนั้น แต่สำหรับวัตถุประสงค์ในทางปฏิบัติทั้งหมดที่เขตเวลาถูกเพิกเฉย java.util.Date ทำงานโดยไม่มีเขตเวลาใด ๆ โดยมีผลเป็น UTC ในขณะที่ละเว้นเขตเวลาที่ฝังอยู่ ยกเว้นtoStringวิธีที่ใช้กับเขตเวลาเริ่มต้นปัจจุบันของ JVM ละเว้นโซนเวลาที่ฝังอีกครั้ง ดังนั้นเพื่อความกระชับเราบอกว่า java.util.Date ไม่มีเขตเวลา เช่นเดียวกับศิลปะมันเป็นเรื่องโกหกที่บอกความจริง
Basil Bourque

@blquythai สำหรับการโทรTimeZone.setDefaultคุณไม่ได้ตั้งค่าเขตเวลาของวัตถุ java.util.Date - วัตถุวันที่ยังคงละเว้นเขตเวลาฝังมันทำหน้าที่อย่างมีประสิทธิภาพใน UTC คุณจะส่งผลต่อtoStringวิธีการของวันที่ การตั้งค่าเริ่มต้นจะเปลี่ยนเขตเวลาเริ่มต้นของ JVM ซึ่งโดยปกติจะถูกตั้งค่าเป็นเขตเวลาของระบบปฏิบัติการโฮสต์ ไม่แนะนำให้โทรดังกล่าวเนื่องจากจะมีผลกับรหัสทั้งหมดในเธรดทั้งหมดของแอปทั้งหมดที่ทำงานใน JVM นั้นและดำเนินการได้ทันทีขณะดำเนินการ เป็นสิ่งที่หยาบคายและอันตรายการโทรนั้นควรถือเป็นทางเลือกสุดท้าย
Basil Bourque

5
โซนเวลาที่ถูกใช้บ่อยมาก (ใช้ไปในequals, hashcode, getTime.. ) ถ้าคุณดูที่เป็นequalsวิธีการที่เรียกว่าgetTime()ซึ่งสายgetTimeImpl()ที่เรียกnormalize()ถ้าcdateคุณสมบัติไม่ได้เป็นปกติ ในnormalize()วิธีสุดท้ายถ้าเงื่อนไขคำนวณมิลลิวินาทีอีกครั้งนับตั้งแต่ 1/1/70 ตามข้อมูลเขตเวลาที่เก็บไว้หากเขตเวลาของcdateแตกต่างจากเขตเวลาของสภาพแวดล้อม JVM ปัจจุบันที่กำลังทำงานอยู่ (ดูที่sun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date))
Thai Bui

2
@MichalM ตามคำแนะนำของคุณเมื่อไม่นานมานี้ฉันได้เพิ่ม afterword เกี่ยวกับโซนฝังตัว
Basil Bourque

75

คุณสามารถตั้งค่าเขตเวลาที่ระดับ 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

สิ่งนี้ช่วยฉัน การตั้งค่าโซนเวลาใน SDF ไม่ได้ทำให้แตกต่าง
วิษณุ viswanath

ฉันคิดว่ามันน่าเชื่อถือมากขึ้น (+1)
foobar

23
ระวัง: การโทรTimeZone.setDefaultค่อนข้างรุนแรงเนื่องจากมีผลกับ JVM ทั้งหมดมีผลกับวัตถุและเธรดอื่นทั้งหมด ดูคำตอบนี้สำหรับรายละเอียดรวมถึงความยุ่งยากที่มากขึ้นหากคุณใช้งาน SecurityManager การเพิ่มความซับซ้อนยิ่งขึ้น: พฤติกรรมนี้มีการเปลี่ยนแปลงใน Java เวอร์ชันต่างๆตามที่กล่าวไว้ในคำถามนี้
Basil Bourque

ชุดนี้เป็นเขตเวลาทั่วไปในทุกกระทู้ที่วางไข่หลังจากข้อความนี้ใช่ไหม
Jaydev

นี่เป็นคำตอบที่ดีกว่าคำถามที่ได้รับการยอมรับ
francogrex

10

หากคุณต้องทำงานกับคลาส 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;
}

เครดิตไปที่โพสต์นี้


1
ออฟเซ็ตของเขตเวลาไม่คงที่เสมอไป ในความเป็นจริงพวกเขาอาจเปลี่ยนไปเนื่องจากเหตุผลทางภูมิศาสตร์ TimeZone.getDSTSavings () ไม่ได้คำนึงถึงสิ่งนี้และจะส่งคืนออฟเซ็ตปัจจุบันเสมอ ซึ่งหมายความว่าคุณอาจได้รับการแปลงที่ไม่ถูกต้องในกรณีที่คุณจัดการกับวันที่ในอดีตด้วย fromTimeZone / toTimeZone ที่มีการเปลี่ยนแปลง offsets ตั้งแต่วันนั้น
andrerobot

6

java.util.Calendarเป็นวิธีปกติในการจัดการโซนเวลาโดยใช้คลาส JDK เท่านั้น Apache Commonsมีทางเลือก / ยูทิลิตี้เพิ่มเติมที่อาจมีประโยชน์ แก้ไขบันทึกย่อของ Spong ทำให้ฉันนึกถึงว่าฉันเคยได้ยินสิ่งดีๆเกี่ยวกับJoda-Time (แม้ว่าฉันจะไม่ได้ใช้มันเอง)


+1 สำหรับ Joda Time แม้ว่ามันจะไม่มีฟังก์ชั่นเพิ่มเติมใด ๆ ที่คุณไม่สามารถรับได้จาก Java API มาตรฐาน (ที่ฉันพบในกรณีใด ๆ - มีความสุขที่จะแสดงเป็นอย่างอื่น) Joda Time ทำให้งานบางอย่างง่ายขึ้น
Joshua Hutchison

2
@JoshuaHutchison Joda เวลามีตันของฟังก์ชันการทำงานเพิ่มเติม ตัวอย่าง: ตัวแทนมีช่วงเวลาที่มีการเรียนการสอนPeriod, และDuration Intervalครอบคลุมเหล่านั้นรวมถึงวิธีการเปรียบเทียบเช่นcontains, abuts, และoverlap gapและPeriodFormatterBuilderสามารถสร้างวลีที่สื่อความหมายเช่น "15 ปี 8 เดือน"
Basil Bourque

1

แปลง Date เป็น String และทำได้ด้วย 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);

1
คำตอบใน Stack Overflow คาดว่าจะมีการสนทนาหรือคำอธิบาย ไซต์นี้มีความหมายว่าเป็นมากกว่าโค้ดไลบรารี
Basil Bourque

ขอบคุณ @Basil Bourque สำหรับความคิดเห็นของคุณ ฉันแก้ไขคำตอบ
avisper

0

หากใครต้องการสิ่งนี้ถ้าคุณต้องการแปลงXMLGregorianCalendarเขตเวลาเป็นเขตเวลาปัจจุบันของคุณจาก 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

0

รหัสนี้มีประโยชน์ในแอพที่ฉันใช้งาน:

    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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.