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

将时间戳转换为特定时区的日期时间

乐正玺
2023-03-14

我想将时间戳(以GMT为单位)转换为本地日期和时间

这是我到目前为止已经实现的,但是它给了我错误的月份

Timestamp stp = new Timestamp(1640812878000L);
Calendar convertTimestamp = convertTimeStamp(stp,"America/Phoenix");
System.out.println(convertTimestamp.getTime());
    

public static Calendar convertTimeStamp( Timestamp p_gmtTime, String p_timeZone) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy HH:MM:SS a", Locale.ENGLISH);
        DateFormat formatter = DateFormat.getDateTimeInstance();
        if (p_timeZone != null) {
            formatter.setTimeZone(TimeZone.getTimeZone(p_timeZone));
        } else {
            formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
        }

        String gmt_time = formatter.format(p_gmtTime);
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(gmt_time));
        return cal;
    }

任何帮助将不胜感激。

共有2个答案

松昱
2023-03-14
Instant
.ofEpochMilli(                       // Parse a count of milliseconds since 1970-01-01T00:00Z.
    1_640_812_878_000L
)                                    // Returns a `Instant` object.
.atZone(                             // Adjust from UTC to a time zone. Same moment, same point on the timeline, different wall-clock time.
    ZoneId.of( "America/Phoenix" ) 
)                                    // Returns a `ZonedDateTime` object.
.format(                             // Generat text representing the date-time value kept within that `ZonedDateTime` object.
    DateTimeFormatter
    .ofLocalizedDateTime( FormatStyle.MEDIUM )
    .withLocale( Locale.US ) 
)                                    // Returns a `String` object.

请参阅此代码在 IdeOne.com 实时运行。

2021 12月29日下午2:21:18

您使用的是几年前被现代java取代的糟糕的旧日期时间类。JSR 310中定义的时间类。切勿使用时间戳日历日期、简单格式等。

使用< code>Instant类表示在UTC中看到的时刻,偏移量为零小时-分钟-秒。

long millisecondsSinceBeginningOf1970InUtc = 1_640_812_878_000L ;
Instant instant = Instant.ofEpochMilli( millisecondsSinceBeginningOf1970InUtc ) ;

指定您感兴趣的时区。

ZoneID z = ZoneId.of( "Africa/Tunis" ) ;

从零偏移量调整到该时区以生成ZonedDateTime对象。

ZonedDateTime zdt = instant.atZone( z ) ;

通过自动本地化生成表示该时刻的文本。使用区域设置指定要在翻译中使用的人类语言,以及在确定缩写、大小写、元素顺序等时使用的区域性。

Locale locale = Locale.JAPAN ; // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG ).withLocale( locale ) ;
String output = zdt.format( f ) ;

所有这些都在Stack Overflow上多次得到解决。搜索以了解更多信息。

羊舌胡非
2023-03-14

你不能把一个时间戳转换成另一个时区,因为时间戳总是GMT,它们是宇宙中时间线上的一个给定时刻。

我们人类习惯于我们星球上的本地时间,所以时间戳可以被格式化为更易于人类阅读,并且在这种情况下,它被转换为本地时区。

使用遗留java.util.*包,执行如下操作:

DateFormat tzFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
tzFormat.setTimeZone(TimeZone.getTimeZone("CET")); // Use whatever timezone
System.out.println(tzFormat.format(date));

如果您需要在本地时区的时间戳上进行“数学”(例如,明天8:00本地时区),那么情况就更复杂了。

为此,您可以诉诸许多黑客攻击(例如解析或修改使用上述方法获得的字符串),或使用新的Java日期

Instant timestamp = Instant.ofEpochMilli(inputValue);
ZonedDateTime romeTime = timestamp.atZone(ZoneId.of("Europe/Rome"));

注意第二个例子是如何使用“欧洲/罗马”而不是一般的“CET”的。如果您计划处理使用DST的时区,这一点非常重要,因为DST变更日(或者他们是否使用DST)可能会因国家而异,即使他们在同一个时区。

 类似资料:
  • 我试图找出如何在Kotlin中将转换为,这在Java中非常简单,但我在Kotlin中找不到任何等效的。 例如:历元时间戳(1970-01-01以来的秒数)== 在Kotlin中是否有解决方案,或者我是否必须在Kotln中使用Java语法?请给我一个简单的例子来说明如何解决这个问题。提前谢谢。 这个链接不是我问题的答案

  • 我在一个应用程序中使用log4j2进行日志记录,并且该应用程序部署在运行于伦敦、东京、纽约等地的服务器上。 我稍后汇总日志以进行分析。为了使其统一,我想将日志的时间戳转换为单个时区,例如GMT或EST。如何在log4j2中做到这一点?

  • 问题内容: 我尝试将其转换为java.sql.Timestamp后插入,并使用以下代码段: 但是,这是给我的 有没有办法在没有毫秒的情况下获得输出? 问题答案: 您可以使用来减少毫秒数: 输出:

  • 问题内容: 我有以下整数形式的时间戳 我可以使用SQL进行转换: 如何在Java中转换它?这样它将返回值: 问题答案: 假设自1970年1月1日以来的时间(以秒为单位)。你可以试试

  • 问题内容: 我必须将linux时间戳转换为android日期。我从服务器获得此号码 我写了一个小代码段。 但这不能正确转换,这是我的结果 编辑 :通常我必须在这里 还有另一种获取正确日期的方法吗??? 问题答案: UNIX时间戳记应以毫秒为单位,因此将Long值乘以1000。因此,您的值1386889262将为1386889262000:

  • 问题内容: 我在mysql数据库中有一个timestamp变量列。尝试将Carbon时间戳转换为我可以在此处输入的内容,但仅返回Carbon对象,当我尝试使用Carbon对象的时间戳字符串时,它未在mysql中注册。 我的第一个var dump就像这样: 我的第二个var dump就是这样。 与“ published_at”有关的mysql列是一个时间戳变量。我想如何将其从Carbon对象转换为?