当前位置: 首页 > 知识库问答 >
问题:

将日期时间字符串从一个时区A转换为jvm在时区C中运行的时区B

潘翊歌
2023-03-14

我有一个场景,我需要转换一个日期时间字符串从时区A(UTC)到时区B(EST)。

这里是发生这种转换的JVM,它是时区C(HKT)日期对象。

因此,代码块如下所示:

String dateString="20141114213000";
dateString += " UTC";
String formatString ="yyyyMMddHHmmss";
SimpleDateFormat sdf = new SimpleDateFormat(formatString + " z");

 Date localDate = sdf.parse(dateString);
 System.out.println("Local Date::"+localDate); // Local Date::Sat Nov 15 05:30:00 HKT 2014

 Calendar localCal = Calendar.getInstance();
 localCal.setTime(localDate);

 TimeZone estTimeZone = TimeZone.getTimeZone("America/New_York");

 localCal.setTimeZone(estTimeZone);
 sdf.setTimeZone(estTimeZone);

 System.out.println(sdf.format(localCal.getTime()));//20141114163000 EST

 System.out.println(localCal.getTime());//Sat Nov 15 05:30:00 HKT 2014

我期望的输出是最后一条语句中的“Fri Nov 14 16:30:00 EST 2014”,即,可用的最终日期对象应该在EST中。

如果有人有这方面的信息,请告诉我。

更新:
为了明确我的请求,输出应该仅在日期对象中。

我打印的示例代码和输出只是为了更清楚地解释。

因此,基本上字符串“20141114213000”是UTC日期字符串,需要转换为EST日期对象,而正在进行转换的JVM是在HKT中。

共有3个答案

汪茂
2023-03-14

使现代化

经过评论中的一些讨论,现在似乎很清楚,您根本不应该依赖java.util.Date的时区。下面勾勒的诀窍(我的原始答案)可能会奏效,但这不是正确的做法。切换到支持时区的东西(例如java.util.日历),但最好使用JodaTime。

警告:对于Sun的java.util.Date实现,这是一个可能(也可能不)有效的技巧,其内部结构用时区初始化。

尝试使用TimeZone.setDefault(...)设置默认时区。

您最后的电话:

System.out.println(localCal.getTime());

实际上是:

System.out.println(new Date(localCal.getTimeInMillis()).toString());

因此,在日历上设置任何时区信息都是毫无意义的。

Date.toString(),但是首先对日期进行内部规范化,并使用静态的时区.getDefaultRef()。这将为您提供默认时区-您可以(通常)通过TimeZone.setdefilt(…)设置该时区。

并通过一切手段使用JodaTime。

漆雕和雅
2023-03-14

这实际上非常简单(不需要Joda时间,也不是说它不是一个很好的库),你只需要在SimpleDateFormat上设置TimeZone。解析时使用源TimeZone,格式化时使用目标TimeZone(并且不需要中间日历)。

更新:

日期没有时区。如果你想要带时区的东西(而不是字符串),那么你需要一个日历。您当前的代码基本上是正确的,只是在解析之前没有在SimpleDataFormat上设置源时区。

艾成益
2023-03-14

Java的日期和时间类似乎存在一些值得注意的问题。

让我们使用流行的Joda Time-Java日期和时间API。只需下载最新的稳定版本,并将jar文件添加到项目的构建路径中。

在逐行的基础上,我已经注释了您的代码,并重写了Joda Time替代方案。这样,您就可以理解我是如何将您现有的代码转换为Joda Time API的。

import java.text.ParseException;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class JodaTimeTransition {
    public static void main(String[] args) throws ParseException {
        String dateString="20141114213000";
        dateString += " UTC";

        /*new*/
        String formatString = "yyyyMMddHHmmss z";
//      String formatString ="yyyyMMddHHmmss";

        /*new*/ 
        DateTimeFormatter dtf = DateTimeFormat.forPattern(formatString);
//      SimpleDateFormat sdf = new SimpleDateFormat(formatString + " z");

        /* new - Create localDate using JodaTime DateTime class */
        DateTime localDate = DateTime.parse(dateString, dtf);
//      Date localDate = sdf.parse(dateString);

        /* new - convert time to MST, since it is currently UTC*/
        localDate = localDate.toDateTime(DateTimeZone.forID("America/Denver"));

        /* new - print out <local date> using specified format.*/
        System.out.println("Local Date::" + localDate.toString("EEE MMM dd HH:mm:ss z yyyy"));
        /* Where did you get the local date mentioned at comments of line below? */
//      System.out.println("Local Date::"+localDate); // Local Date::Sat Nov 15 05:30:00 HKT 2014


        /* new - Get reference to current date/time as <localCal> 
         * (This step can be omitted, and the previous localDate variable can be used)
        */
        DateTime localCal = DateTime.now();
//      Calendar localCal = Calendar.getInstance();

        /* new - Set <localCal> to <localDate> */
        localCal = localDate;
//      localCal.setTime(localDate);

        /* new - Create new EST time zone*/
        DateTimeZone estTimeZone= DateTimeZone.forID("America/New_York");
//      TimeZone estTimeZone = TimeZone.getTimeZone("America/New_York");

        /* new - set <localCal> time zone from MST to EST */
        localCal = localCal.toDateTime(estTimeZone);
//      localCal.setTimeZone(estTimeZone);
//      sdf.setTimeZone(estTimeZone);

        /* new - print <localCal> as new EST time zone */
        System.out.println(localCal.toString("yyyyMMddHHmmss z"));
//      System.out.println(sdf.format(localCal.getTime()));//20141114163000 EST

        /* new - print in desired format: Fri Nov 14 16:30:00 EST 2014 */
        System.out.println(localCal.toString("EEE MMM dd HH:mm:ss z yyyy"));
//      System.out.println(localCal.getTime());//Sat Nov 15 05:30:00 HKT 2014
    }
}
 类似资料:
  • 问题内容: 基本上,我需要的是一个脚本,该脚本在提供时间和时区时可以返回另一个时区中的时间。 我的主要问题是: 从哪里获取GMT的时间偏差-是否有公共数据库可用于此? 如何也考虑夏时制(DST)的差异。 如何将其全部包装到PHP类中?或者是否已有这样的类? 问题答案: format('Y-m-d H:i:sP') . "\n"; 上面的示例将输出: 编辑:就像Pekka所说的:DateTime类从

  • 问题内容: 具体来说,给定服务器的时区(系统时间角度)和时区输入,我如何计算系统时间,就像它在那个新时区中一样(无论夏时制如何)? 问题答案: 如果知道您的原始时区和要将其转换为的新时区,那么结果将非常简单: 为当前时区和新时区都创建一个对象,例如。如果您不知道时区的官方名称,只需拨打以下电话即可找到所有官方时区的列表 呼叫使用当前时区的pytz对象与你的日期时间/时间戳输入到它定位到当前时区。例

  • 我有一个本地日期时间的字符串表示和一个Java时区。 我正在尝试以 MM/dd/yyyy HH:mm:ssZ 格式获取输出,但我无法弄清楚如何使用正确的日期时间和时区创建日历或 JodaTime 对象。如何将时区转换为可以通过简单日期格式“Z”或“z”解析的值? 和 返回 这是 。 是创建日历或Joda日期时间并通过解析字符串“08/14/2014 15:00:00”来设置各个年/月/日/小时/分

  • 问题内容: 我已编写此代码将当前系统日期和时间转换为其他时区。我没有收到任何错误,但没有得到预期的输出。就像我在特定时间执行程序一样。我的输出是:: 当前 印度 时间是:: :: 中部标准时间 的日期和 时间 是:: 根据 CST时区 的实际时间是:: 所以有一些 时间间隔 。而且我不知道为什么会这样。任何帮助将不胜感激..代码是:: 问题答案: 通过网络。可以用谷歌搜索。无论如何,这是一个适合您

  • 问题内容: 这是我的约会日期“ 15-05-2014 00:00:00” 如何将IST转换为UTC即(到14-05-2014 18:30:00) 基于时区到UTC时区。 我的代码是 如果用户从任何区域输入相同的日期,则将获得UTC时间(例如:从澳大利亚,然后从15-05-2014 00:00:00到14-05-2014 16:00:00) 请任何建议。 问题答案: 您不能将日期值“转换为”其他时区

  • > 如何将IST转换为UTC,即(至2014年5月14日18:30:00) 我的代码是 > 如果用户从任何区域输入相同的日期,则将获得UTC时间(例如:从澳大利亚输入,然后是2014年5月15日00:00:00至2014年5月14日16:00:00) 请提出任何建议。