Java 根据用户时区进行日期转换
我们正在将数据库日期转换为所需的用户时区。但若我们使用字符串格式的jodatime格式化,我们得到的是正确的日期,若我们解析字符串以得到日期对象,我们得到的是错误的时间。这是我的密码。我尝试了jodatime解析器和javadateJava 根据用户时区进行日期转换,java,datetime,timezone,jodatime,Java,Datetime,Timezone,Jodatime,我们正在将数据库日期转换为所需的用户时区。但若我们使用字符串格式的jodatime格式化,我们得到的是正确的日期,若我们解析字符串以得到日期对象,我们得到的是错误的时间。这是我的密码。我尝试了jodatime解析器和javadate public class Test { public static void main(String[] args) { String dateF = "01/19/2019 at 07:35 PM (UTC)"; Stri
public class Test {
public static void main(String[] args) {
String dateF = "01/19/2019 at 07:35 PM (UTC)";
String dateFormat = "MM/dd/yyyy 'at' hh:mm a (zzz)";
long time = 1603305000;
String timeZone = "Etc/UTC";
Locale locale=new Locale("en", "US");
DateTimeFormatter dateFormatter = null;
if (locale.equals(Locale.FRENCH)) {
dateFormatter = DateTimeFormat.forPattern(dateFormat).withLocale(locale);
} else {
dateFormatter = DateTimeFormat.forPattern(dateFormat).withLocale(null);
}
if (true) {
dateFormatter = dateFormatter.withZone(DateTimeZone.forID(timeZone));
}
// Old Logic using Java Time
DateFormat format3 = new SimpleDateFormat(dateFormat, locale);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time);
if(true)
format3.setTimeZone(TimeZone.getTimeZone(timeZone));
DateTime jodatime = new DateTime(time);
try {
System.out.println(dateFormatter.print(jodatime));
System.out.println("timezone converted Date : " + format3.parse(dateFormatter.print(jodatime)));
System.out.println("dateFormatter.parseDateTime converted Date : " + dateFormatter.parseDateTime(dateFormatter.print(jodatime)).toDate());
} catch (Exception e) {
System.out.println(e);
}
}
}
以格式化字符串更正日期1970年1月19日下午1:21(UTC)
解析后我们得到了错误的结果
时区转换日期:1970年1月19日星期一18:51:00
dateFormatter.parseDateTime转换日期:Mon Jan 19 18:51:00 IST 1970
格式化日期中的正确日期:Mon Jan 19 01:21:00 UTC 1970
避免传统日期时间类
您使用的是与最早版本的Java捆绑在一起的糟糕的旧类。这些已经被现代的java.time类完全取代
显然,您还将这些遗留类与来自Joda时间库的类混合在一起。首先,这种混合是不明智的。其次,Joda Time现在处于维护模式,其创建者建议迁移到java.Time。实际上,Joda Time和java.Time项目都是由同一个人Stephen Colebourne领导的,第一个项目是第二个项目的灵感和教育
智能对象,而不是哑字符串
我们正在转换数据库日期
然后避免您正在进行的所有字符串操作
从JDBC4.2开始,您可以直接与数据库交换java.time对象。暂时,表示一个类似于SQL标准的带有时区的时间戳的列,请使用class
……还有
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
大多数数据库以UTC格式存储时刻。您可能希望调整到一个时区,以便向用户演示。应用ZoneId
以获取zoneDateTime
对象
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
使用DateTimeFormatter
对象生成特定格式的文本。可以指定自定义格式模式,也可以通过调用本地化…
方法来自动本地化
所有这些都已经在堆栈溢出上讨论过很多次了。搜索以了解更多信息
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期Android(避免遗留日期时间类
您使用的是与最早版本的Java捆绑在一起的糟糕的旧类。这些类已被现代的Java.time类完全取代
显然,您还将这些遗留类与Joda Time库中的类混合在一起。首先,这种混合是不明智的。其次,Joda Time现在处于维护模式,其创建者建议迁移到java.Time。实际上,Joda Time和java.Time项目都由同一个人Stephen Colebourne领导,第一个项目是h阿文一直是第二代人的灵感和教育
智能对象,而不是哑字符串
我们正在转换数据库日期
然后避免您正在进行的所有字符串操作
从JDBC 4.2开始,您可以直接与数据库交换java.time对象。暂时,使用class,这意味着类型类似于SQL标准
方法自动本地化 所有这些都已经在堆栈溢出上讨论过很多次了。搜索以了解更多信息时区时间戳的列 ……还有
大多数数据库以UTC为单位存储时刻。您可能希望调整到一个时区,以便向用户演示。应用OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
以获取ZoneId
对象zoneDateTime
使用ZoneId z = ZoneId.of( "Asia/Kolkata" ) ; ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
对象生成特定格式的文本。指定自定义格式模式或通过调用本地化…DateTimeFormatter
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
classes 从哪里获得java.time类java.sql.*
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(当您使用Joda Time时,为什么要使用
?为什么要使用不推荐的Joda Time,而不是Java Time API?仅供参考,非常麻烦的旧日期时间类,例如,SimpleDateFormat
现在被内置到Java 8和更高版本中的类所取代。请参见.FYI,该项目现在已经完成。)在中,建议迁移到类。根据Unix时间1603305000相当于10/21/2020@6:30pm(UTC)。是否确实希望1970年1月19日01:21pm(UTC)?周一1月19日18:51:00 IST 1970 agreJava.text.SimpleDateFormat
- 、和更高版本-标准Java API的一部分,带有捆绑实现。