Java 根据用户时区进行日期转换

Java 根据用户时区进行日期转换,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

我们正在将数据库日期转换为所需的用户时区。但若我们使用字符串格式的jodatime格式化,我们得到的是正确的日期,若我们解析字符串以得到日期对象,我们得到的是错误的时间。这是我的密码。我尝试了jodatime解析器和javadate

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标准
      时区时间戳的列

      ……还有

      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.*
      classes

      从哪里获得java.time类

      • 、和更高版本-标准Java API的一部分,带有捆绑实现。
        • Java9添加了一些次要功能和修复
        • 大多数java.time功能都在中向后移植到Java6和Java7
        • 更高版本的Android捆绑包实现了java.time类

        • 对于早期的Android(当您使用Joda Time时,为什么要使用
          SimpleDateFormat
          ?为什么要使用不推荐的Joda Time,而不是Java Time API?仅供参考,非常麻烦的旧日期时间类,例如,
          Java.text.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 agre