Java日期格式问题

时间:2013-08-06 04:04:13

标签: java

我有从1969年12月31日19:00:00即(EST)的秒数,我想将其转换为日期格式。

我有以下代码返回任何无效日期。任何人都可以指出这里似乎是什么问题。

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;


public class sample 
{

    public static void main(String args[])
    {
        DateFormat df = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("EST"));
        Date d1 = new Date(1000*1373604190); //Converting to millisecond
         String formattedDate = df.format(d1); 
         System.out.println(formattedDate); //I'm getting 22/Dec/1969 16:50:55
    }
}

我该如何解决这个问题。

2 个答案:

答案 0 :(得分:5)

您的号码中使用的是int文字,而不是long。默认情况下,积分文字为int,除非您在结尾指定为long且L为{}。试试这个:

Date d1 = new Date(1000*1373604190L);

(注意文字1373604190末尾的L)

答案 1 :(得分:0)

TL;博士

Instant.ofEpochSeconds( 1_373_604_190L ) 
       .atZone( ZoneId.of( "America/New_York" ) )
       .format( DateTimeFormatter.ofPattern( "dd MMM uuuu HH:mm:ss" , Locale.CANADA ) )

详细

  

从1969年12月31日19:00:00即(EST)

的秒数

在做日期工作时不要狭隘地思考。不要将epoch reference moment等值转换为您自己区域内外的值,而只需在UTC中进行思考。将UTC视为 The One True Time ,所有其他人都是该主题的变体。

所以,总是将纪元参考时刻称为1970-01-01T00:00:00Z,即1970年的第一个UTC时刻,而不是任何其他时区。

  

(EST)

此外,请勿使用这些3-4个字母的缩写作为时区。以continent/region格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。那些3-4个字母的缩写,例如ESTIST不是真正的时区,不是标准化的,甚至不是唯一的(!)。

使用java.time

执行此工作的现代方法是使用java.time类。

long secondsSinceEpoch = 1_373_604_190L ;

我们将其转换为Instant对象。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = Instant.ofEpochSeconds( secondsSinceEpoch ) ;

要通过某些wall-clock time的镜头查看此值,请将时区应用为ZoneId以获取ZonedDateTime个对象。

我猜测,EST你的意思是美国和加拿大东部大部分地区使用的时区。我会随意选择时区America/New_York

ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = instant.atZone( "America/New_York" );
  

secondsSinceEpoch:1373604190

     

instant.toString():2013-07-12T04:43:10Z

     

zdt.toString():2013-07-12T00:43:10-04:00 [America / New_York]

请参阅live code at IdeOne.com

字符串

要生成字符串,您可以让java.time自动本地化,也可以指定显式格式化模式。

Locale locale = Locale.CANADA ;
DateTimeFormatter formatterLocalized = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale );
String outputLocalized = zdt.format( formatterLocalized );
  

2013年7月12日上午12:43:10

DateTimeFormatter formatterCustom = DateTimeFormatter.ofPattern( "dd MMM uuuu HH:mm:ss" , locale );
String output = zdt.format( formatterCustom );
  

2013年7月12日00:43:10

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore