将时间戳转换为特定时区的日期时间
Convert timestamp to Date time for a particular timezone
我想将时间戳 (which is in GMT)
转换为 local date and time
。
这是我目前所实施的,但它给了我错误的月份
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;
}
如有任何帮助,我们将不胜感激。
您不能将时间戳转换为另一个时区,因为时间戳始终是格林威治标准时间,它们是宇宙时间线上的给定时刻。
我们人类习惯于地球上的本地时间,因此时间戳可以 格式化 以提高人类可读性,并且在这种情况下,它会转换为本地时区。
使用遗留 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 日期和时间 classes一个特定的 class 来处理本地时区的日期和时间:
Instant timestamp = Instant.ofEpochMilli(inputValue);
ZonedDateTime romeTime = timestamp.atZone(ZoneId.of("Europe/Rome"));
请注意第二个示例如何使用“Europe/Rome”而不是一般的“CET”。如果您计划处理使用 DST 的时区,这一点非常重要,因为 DST 更改日(或者他们是否使用 DST)可能会因国家/地区而异,即使它们处于同一时区。
tl;博士
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.
看到这个code run live at IdeOne.com。
Dec 29, 2021, 2:21:18 PM
详情
您正在使用可怕的旧日期时间 classes,这些日期时间在几年前被现代 java.time classes 所取代JSR 310。切勿使用 Timestamp
、Calendar
、Date
、SimpleDateFormat
等
使用 Instant
class 表示 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 = Locale.JAPAN ; // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG ).withLocale( locale ) ;
String output = zdt.format( f ) ;
所有这些都已在 Stack Overflow 上多次解决。搜索以了解更多信息。
我想将时间戳 (which is in GMT)
转换为 local date and time
。
这是我目前所实施的,但它给了我错误的月份
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;
}
如有任何帮助,我们将不胜感激。
您不能将时间戳转换为另一个时区,因为时间戳始终是格林威治标准时间,它们是宇宙时间线上的给定时刻。
我们人类习惯于地球上的本地时间,因此时间戳可以 格式化 以提高人类可读性,并且在这种情况下,它会转换为本地时区。
使用遗留 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 日期和时间 classes一个特定的 class 来处理本地时区的日期和时间:
Instant timestamp = Instant.ofEpochMilli(inputValue);
ZonedDateTime romeTime = timestamp.atZone(ZoneId.of("Europe/Rome"));
请注意第二个示例如何使用“Europe/Rome”而不是一般的“CET”。如果您计划处理使用 DST 的时区,这一点非常重要,因为 DST 更改日(或者他们是否使用 DST)可能会因国家/地区而异,即使它们处于同一时区。
tl;博士
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.
看到这个code run live at IdeOne.com。
Dec 29, 2021, 2:21:18 PM
详情
您正在使用可怕的旧日期时间 classes,这些日期时间在几年前被现代 java.time classes 所取代JSR 310。切勿使用 Timestamp
、Calendar
、Date
、SimpleDateFormat
等
使用 Instant
class 表示 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 = Locale.JAPAN ; // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG ).withLocale( locale ) ;
String output = zdt.format( f ) ;
所有这些都已在 Stack Overflow 上多次解决。搜索以了解更多信息。