2016-07-08 131 views
0

因此,我现在尝试了几个小时来将时间戳转换为本地日期(CEST)。将UTC时间戳转换为本地日期

 Date date = new Date(stamp*1000); 
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("CEST")); 
    String myDate = simpleDateFormat.format(date); 

它不工作无论我尝试在网上查找我总是回来UTC时间......

为了更好的理解:邮票是long类型,我会一个变量时间戳从服务接收

+0

这应该有所帮助:http://stackoverflow.com/questions/7670355/convert-date-time-for-given-timezone -java – Jens

+0

我尝试了11个upvotes的建议,因为您可能已经看到,它不工作 – Nali

+0

尝试[this](http://stackoverflow.com/questions/19431234/converting-between-java-time-localdatetime-and-java -util-date) –

回答

2

TL;博士

String output = ZonedDateTime.ofInstant (Instant.ofEpochSecond (1_468_015_200L) , ZoneId.of ("Europe/Paris")).toString(); 

详细

的几个问题:

  • 您没有使用proper time zone names
    • 专有名称格式为continent/region格式。
    • 媒体中常见的3-4字母缩写如CEST分别为而不是真实时区。 避免它们。它们既不标准也不唯一(!)。
  • 您正在使用设计欠佳并且令人困惑的旧式过时日期类。它们已被java.time框架所取代。

如果CEST你的意思是提前在夏季UTC的2小时,然后让我们Europe/Paris作为一个例子时区。你的问题缺乏示例数据,所以我将编写这个示例。

显然你的输入是从UTC 1970年第一时间的时代开始的整秒数。该值可以直接使用,不需要繁殖。

ZoneId class表示时区。 Instant是UTC时间线上的一个点,分辨率高达纳秒。 A ZonedDateTimeInstant调整为ZoneId

ZoneId zoneId = ZoneId.of ("Europe/Paris"); 
long input = 1_468_015_200L; // Whole seconds since start of 1970. 
Instant instant = Instant.ofEpochSecond (input); 
ZonedDateTime zdt = ZonedDateTime.ofInstant (instant , zoneId); 

转储到控制台。

System.out.println ("input: " + input + " | instant: " + instant + " | zdt: " + zdt); 

输入:1468015200 |即时:2016-07-08T22:00:00Z | zdt:2016-07-09T00:00 + 02:00 [欧洲/巴黎]

+0

不喜欢它如何显示在最后.... – Nali

+0

@Nali你的意思是代表日期时间值的字符串的格式?你的问题没有提及格式。无论如何,使用'DateTimeFormatter'来生成任何格式的字符串的很多例子都是在Stack Overflow中搜索的。这里显示的格式符合ISO 8601标准。您可以指定其他格式或让java.time自动定位到任何'Locale'。 –

+0

@BasilBourque如评论中所述,OP尚未使用Java 8。我不知道他的约束是什么,但我想他现在必须处理它。 –

0

您的TimeZone ID很可能是不正确的(很好,不被Java识别)。看来,在这种情况下,TimeZone被评估为UTC,而不是抛出异常。

试试这个:

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("ECT")); 

Here是提供有关Java的TimeZone和时区ID的列表中的一些信息的页面。

+0

我试过一切它只会显示我的UTC时间没有其他 – Nali

+0

@Nali你什么意思是完全由一切?你尝试过“大陆/地区”格式吗? 'simpleDateFormat.setTimeZone(TimeZone.getTimeZone(“Europe/Brussels”));'例如 –

+0

是的,我也试过,但它总是相同的我得到的UTC日期..... – Nali