Java将毫秒时间戳转换为给定时区的日期
我已经看过很多关于这方面的资料,但有一件事我不能得到,那就是当转换毫秒时间戳时,我如何在转换过程中添加相应的时区Java将毫秒时间戳转换为给定时区的日期,java,date,simpledateformat,date-formatting,timezone-offset,Java,Date,Simpledateformat,Date Formatting,Timezone Offset,我已经看过很多关于这方面的资料,但有一件事我不能得到,那就是当转换毫秒时间戳时,我如何在转换过程中添加相应的时区 Date date = new Date(Long.valueOf(dateInMil*1000L); SimpleDateFormat myDate = new SimpleDateFormat("EEE, MMM d, ''yy"); String formatted = myDate.format(date); 现在,如果我有一个字符串格式的时区/偏移量,即“-04:00”或
Date date = new Date(Long.valueOf(dateInMil*1000L);
SimpleDateFormat myDate = new SimpleDateFormat("EEE, MMM d, ''yy");
String formatted = myDate.format(date);
现在,如果我有一个字符串格式的时区/偏移量,即“-04:00”或“+2:00”,那么如何将其应用于上述内容,以便获得正确的日期 不完全是你要找的,但很接近
String timeZone = "America/Los_Angeles"
TimeZone tz = TimeZone.getTimeZone(timeZone);
SimpleDateFormat sdf = new SimpleDateFormat("EEEEE MMMMM d hh:mm a");
sdf.setTimeZone(tz);
Date localizedTime = sdf.format(new Date());
如果保留本地化字符串而不是偏移量,这将起作用。或者你可以制作一张地图。我在上一个项目中做了类似的事情。你可以使用SimpleDataFormat类的setTimeZone方法。大概是这样的:
mydate.setTimeZone(TimeZone.getTimeZone("GMT -0400"));
tl;博士
java.time
现代方法使用java.time类,而不是现在遗留的麻烦的旧日历
/日期
类
假设您的毫秒计数是自1970年的第一个时刻(1970-01-01T00:00)开始的计数,然后解析为瞬间
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
若要从移动到另一时区,请应用以获取
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
对象与文本
指定时区后,以所需格式生成字符串(而不是之前)。您可能将日期时间值(对象)与以文本形式表示其值的字符串合并。学会思考智能对象,而不是愚蠢的字符串
DateTimeFormatter
要生成特定格式的字符串,请使用。搜索堆栈溢出,因为这已经被多次讨论过了,这里显示的其他概念也是如此。特别值得注意的是方法
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和
这张照片
Wed, Apr 3, '19
您给出的另一个示例偏移量,+2:00
,稍微有点困难,因为区域偏移量(+2
)在冒号(+02:00
)之前只需要小时或两位数小时。一种解决方案是在将字符串交给ZoneOffset
之前修复该字符串:
String utcOffsetString = "+2:00";
utcOffsetString = utcOffsetString.replaceFirst("([-+])(\\d:\\d{2})", "$10$2");
ZoneOffset offset = ZoneOffset.of(utcOffsetString);
结果仍然是19年4月3日星期三。如果字符串中已经有两位数的小时,replaceFirst
不会替换任何内容,因此您只需返回相同的字符串即可
如果我将偏移量更改为+08:00
,则取而代之的是周四、四月四日、四月十九日
编辑:坦率地说,我发现用于修复偏移量字符串的正则表达式非常不可读。下面是一种更简单的修复方法:
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("O", Locale.ENGLISH);
ZoneOffset offset = ZoneOffset.from(offsetFormatter.parse("GMT" + utcOffsetString));
就像我用的巴兹尔波克。查看中的所有详细信息。为什么要将毫秒转换为微秒?dateInMil
实际上是秒吗?注意:如果您使用的是Java 8,则不应使用Date
或Calendar
对象,而应使用LocalDate
,例如fyi、和Java.text.SimpleDateFormat等麻烦的旧日期时间类,被内置在Java8和Java9中的类所取代。请参阅。请在发布前搜索堆栈溢出。这些问题已经讨论过很多次了。您实际上是在一个问题中提出两个问题,而应该将它们作为两个问题发布:如何解析像“-04:00”
这样的偏移量,以及如何将毫秒转换为给定偏移量的日期。理论上,如果您坚持使用过时的类,这应该是正确的解决方案。然而,无论我把GMT-1400
或GMT+1400
放在一起,我仍然得到相同的日期。旧阶级比人们想象的更麻烦。我不鼓励使用它们。改为使用java.time
。我会将您的解决方案标记为已接受,因为它是我开始使用的方式,并且对我有效,但由于某些原因,在第一次使用它时,它在早期不起作用。
DateTimeFormatter myDateFormatter
= DateTimeFormatter.ofPattern("EEE, MMM d, ''yy", Locale.ENGLISH);
long dateInSec = 1_554_321_098L;
String utcOffsetString = "-04:00";
ZoneOffset offset = ZoneOffset.of(utcOffsetString);
String date = Instant.ofEpochSecond(dateInSec)
.atOffset(offset)
.format(myDateFormatter);
System.out.println(date);
Wed, Apr 3, '19
String utcOffsetString = "+2:00";
utcOffsetString = utcOffsetString.replaceFirst("([-+])(\\d:\\d{2})", "$10$2");
ZoneOffset offset = ZoneOffset.of(utcOffsetString);
DateTimeFormatter offsetFormatter = DateTimeFormatter.ofPattern("O", Locale.ENGLISH);
ZoneOffset offset = ZoneOffset.from(offsetFormatter.parse("GMT" + utcOffsetString));