我有一个日期对象,我需要将其转换为登录用户的时区。问题是时区在我们的数据库中仅表示为GMT的字符串值加上或减去以小时为单位的偏移量。例如纽约时间的“GMT”或“GMT-5”或“GMT + 5”。
当我拥有的所有字符串都是“GMT-3”或“GMT + 5”字符串时,如何将我的日期对象转换为用户的时间?
提前感谢您的帮助。
答案 0 :(得分:2)
示例应该有所帮助,但它似乎是1个字符ISO 8601 time zone:
String myDate="2001-07-04T12:08:56GMT-3";
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'GMT'X");
if (myDate.indexOf("GMT-") >= myDate.length() -1 -4) {
myDate = myDate.replace("-","-0");
}
if (myDate.indexOf("GMT+") >= myDate.length() -1 -4) {
myDate = myDate.replace("+","+0");
}
System.out.println(format.parse(myDate));
它应该有用。
yyyy-MM-dd'T'HH:mm:ss'GMT'X
符合iso8601时区myDate = myDate.replace("-","-0");
将日期调整为您的格式答案 1 :(得分:1)
正如Jon Skeet在评论中所说,时区不仅仅是UTC / GMT的偏移。存储偏移小时(和分钟)是处理数据库/存储中日期时间的不太理想的策略。
java.util.Date& java.util.Calendar类非常麻烦。避免他们。使用Joda-Time。或者,在Java 8中,使用由JSR 310定义的新java.time.* package,并受Joda-Time的启发,但重新设计。
我们可以创建一个DateTimeZone来表示偏移量,但是如上所述,这并不是逻辑上完整的时区。
我们可以将java.util.Date对象直接传递给Joda-Time DateTime构造函数。与此同时,我们传递了一个DateTimeZone对象。要转到另一个转换方向,请在DateTime对象上调用toDate
。
java.util.Date date = new java.util.Date(); // Retrieved from elsewhere. Faked here.
String offsetInput = "GMT-5";
int offsetHours = 0, offsetMinutes = 0;
offsetInput = offsetInput.replace( "GMT", "" ); // Delete 'GMT' characters.
String[] parts = offsetInput.split(":"); // About splitting a string: http://stackoverflow.com/q/3481828/642706
// Handle results of split.
if( parts.length == 0 ) {
// Add some error handling here
}
if ( parts.length >= 1 ) {
offsetHours = Integer.parseInt( parts[0] ); // Retrieve text of first number (zero-based index counting).
}
if ( parts.length >= 2 ) {
offsetMinutes = Integer.parseInt( parts[1] ); // Retrieve text of second number (zero-based index counting).
}
if( parts.length >= 3 ) {
// Add some error handling here
}
DateTimeZone partialTimeZoneWithOnlyOffset = DateTimeZone.forOffsetHoursMinutes( offsetHours, offsetMinutes );
DateTime dateTime = new DateTime( date, partialTimeZoneWithOnlyOffset );
转储到控制台...
System.out.println( "date: " + date ); // BEWARE: JVM's default time zone applied in the implicit call to "toString" of a Date. Very misleading.
System.out.println( "partialTimeZoneWithOnlyOffset: " + partialTimeZoneWithOnlyOffset );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime with alternate formatting: " + DateTimeFormat.forStyle( "FF" ).withLocale( Locale.US ).print( dateTime ) );
跑步时......
date: Sat Feb 08 22:40:57 PST 2014
partialTimeZoneWithOnlyOffset: -05:00
dateTime: 2014-02-09T01:40:57.810-05:00
dateTime with alternate formatting: Sunday, February 9, 2014 1:40:57 AM -05:00