Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将毫秒时间戳转换为给定时区的日期_Java_Date_Simpledateformat_Date Formatting_Timezone Offset - Fatal编程技术网

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));