2014-01-22 36 views
0
public class TestDate { 
    public static void main(String[] args) { 
      Date data1 = new Date(25682400000L); 
      Date data2 = new Date(25686000000L); 
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss"); 
      TimeZone cdtTime = TimeZone.getTimeZone("CST"); 
      sdf.setTimeZone(cdtTime); 
      String s1 = sdf.format(data1); 
      String s2 = sdf.format(data2); 
      System.out.println(s1); 
      System.out.println(s2); 
    } 
} 

后运行上面的代码,结果:java的SimpleDateFormat的CST不同的日期,但同样的结果

1970-10-25:01-00-00 
1970-10-25:01-00-00 

有人能告诉我为什么感谢

回答

0

使用大写L

使用的?长整型文字末尾的大写字母L可使编号更易于阅读。小写字母l通常看起来像许多字体中的一个1

25682400000L而不是25682400000l

1小时的时差

25686000000L - 25682400000L = 3600000L

3600000毫秒=3600秒=60分钟= 1小时

如果他们完全是一个小时的间隔,为什么你看到凌晨1点了都?请继续阅读。

夏令时

如果“CST”,你的意思是美国,然后是Daylight Savings Time(DST)的疯狂的中部去拉你一招。 1970年10月25日凌晨2点是DST ended in that part of the United States。所以在凌晨2点的时候,时钟回到了凌晨1点。所以那天早上有两个“上午”时间。

请参阅下面的代码示例,并注意两条线都表示上午1点,但它们的时区偏移量(结尾处)不同(-5 vs -6)。

3字母代码

避免使用三个字母的时区代码。问题包括:

  • 它们既不标准也不唯一。多个不同的时区可以共享相同的代码。
  • 他们混淆不清,因为人们将他们与夏令时相当。

要么使用:

乔达时间

与java.util.Date,与Java捆绑.Calendar和java.text.SimpleDateFormat的班是出了名麻烦。避免它们。

这种日期时间的工作是如此使用容易得多之一:

  • Joda-Time
  • 新java.time *类(在Java中8)
long data1 = 25682400000L; 
long data2 = 25686000000L; 

DateTimeZone timeZone = DateTimeZone.forID("America/Chicago"); 

DateTime dateTime1 = new DateTime(data1, timeZone); 
DateTime dateTime1_UTC_GMT = dateTime1.toDateTime(DateTimeZone.UTC); 

DateTime dateTime2 = new DateTime(data2, timeZone); 
DateTime dateTime2_UTC_GMT = dateTime2.toDateTime(DateTimeZone.UTC); 

转储到控制台...

System.out.println("dateTime1: " + dateTime1); 
System.out.println("dateTime1_UTC_GMT: " + dateTime1_UTC_GMT); 

System.out.println("dateTime2: " + dateTime2); 
System.out.println("dateTime2_UTC_GMT: " + dateTime2_UTC_GMT); 

运行时...

dateTime1: 1970-10-25T01:00:00.000-05:00 
dateTime1_UTC_GMT: 1970-10-25T06:00:00.000Z 

dateTime2: 1970-10-25T01:00:00.000-06:00 
dateTime2_UTC_GMT: 1970-10-25T07:00:00.000Z