我正在尝试将UTC的长时间戳转换为东部标准时间并完全丢失。任何提示都会很棒!
谢谢, [R
答案 0 :(得分:4)
试试这个:
Date estTime = new Date(utcTime.getTime() + TimeZone.getTimeZone("EST").getRawOffset());
其中utcTime是UTC时间的Date对象(如果你已经有了long值 - 只需使用它)
答案 1 :(得分:3)
final Calendar c = Calendar.getInstance(TimeZone.getTimeZone("EST"));
c.setTimeInMillis(longTime);
其中longTime
是UTC时间内自纪元以来的毫秒数。然后,您可以使用Calendar类的方法来获取日期/时间的各种组件。
答案 2 :(得分:1)
rd42,你能给我一些更多的背景吗?
你说你有一个“UTC时间戳”。这是存储在数据库中的吗?它是一个字符串吗?
如果您可以提供您正在尝试使用的上下文,我或许可以为您提供更多答案。
好的,为了清楚起见,你所说的是你有一个代表UTC时间戳的长值。
因此,在这种情况下,您将要做的是以下内容。
import java.util.Calendar;
import java.util.TimeZone;
TimeZone utcTZ= TimeZone.getTimeZone("UTC");
Calendar utcCal= Calendar.getInstance(utcTZ);
utcCal.setTimeInMillis(utcAsLongValue);
现在你的日历对象是UTC格式。
要显示此内容,您需要执行以下操作:
import java.text.SimpleDateFormat;
import java.util.Date;
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz");
sdf.setTimeZone(utcTZ);
Date utcDate= utcCal.getTime();
sdf.formatDate(utcDate);
这将允许您读入存储为long值的UTC时区的时间戳,并将其转换为Java Calendar或Date对象。
希望能让你到达目的地。
答案 3 :(得分:0)
java.time
现代 API 的解决方案Instant
表示时间线上的一个瞬时点。它独立于时区。为了在时区中表示它,您可以使用 Instant#atZone
或 ZonedDateTime#ofInstant
,如下所示:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// A sample timestamp
long millis = 1620999618896L;
Instant instant = Instant.ofEpochMilli(millis);
System.out.println(instant);
ZonedDateTime zdtET = instant.atZone(ZoneId.of("America/New_York"));
System.out.println(zdtET);
// Alternatively
zdtET = ZonedDateTime.ofInstant(instant, ZoneId.of("America/New_York"));
System.out.println(zdtET);
}
}
输出:
2021-05-14T13:40:18.896Z
2021-05-14T09:40:18.896-04:00[America/New_York]
2021-05-14T09:40:18.896-04:00[America/New_York]
输出中的 Z
是零时区偏移的 timezone designator。它代表祖鲁语并指定 Etc/UTC
时区(时区偏移为 +00:00
小时)。
注意:无论出于何种原因,如果您需要将 Instant
的这个对象转换为 java.util.Date
的对象,您可以这样做:
Date date = Date.from(instant);
从 modern date-time API 了解有关 Trail: Date Time* 的更多信息。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。