字符串日期为GMT日期,但它显示EST

时间:2016-02-08 10:57:16

标签: java android date

我希望这个日期能够在GMT" 01/01/02和#34;

中显示

期待结果 - " Fri Jan 01 00:00:00 GMT 2100"

我看到的结果 - " 12月31日星期四19:00 00:00美国东部时间2099"

  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
  sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
  try{
       Date myDate = sdf.parse("01/01/2100");
           System.out.println(myDate);

  }
  catch(Exception e){

  }

我希望结果myDate在GMT时间不是EST

示例2

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  sdf.setTimeZone(TimeZone.getTimeZone("gmt"));
  try{
       Date myDate = sdf.parse("2010-05-23 09:01:02");

       SimpleDateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm");
      System.out.println("MYDATE: " +df.format(myDate));

  }
  catch(Exception e){

  }

输出:Sun,2010年5月23日,05:01

期待:Sun,2010年5月23日,09:01

http://goo.gl/uIy9RQ - 我的项目代码的URL,运行并检查结果

3 个答案:

答案 0 :(得分:1)

正如评论中所述,您必须将日期格式应用于Date。我修改了您的代码以显示myDate

try{
     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
     sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
     Date myDate = sdf.parse("01/01/2100");
     System.out.println(sdf.format(myDate));
     sdf.setTimeZone(TimeZone.getTimeZone("EST"));
     System.out.println(sdf.format(myDate));
}
catch(Exception e){
     // error handling
}

输出

01/01/2100
31/12/2099

但是不要忘记日期仍然包含有关小时,分钟,秒等的信息。关于应用日期格式化程序,此信息在运行时不会显示

System.out.println(sdf.format(myDate));

如果您需要设置日期的某些字段,则应使用Calendar

答案 1 :(得分:0)

要自定义日期格式,请使用以下

DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm");
String date = df.format(Calendar.getInstance().getTime());


日期格式参数可以是以下任何一种

"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time

答案 2 :(得分:0)

java.util.Date上的

toString是误导性的

正如之前在Stack Overflow上多次提到的那样,java.util.Date的toString方法在生成日期时间值的文本表示时静默应用JVM的当前默认时区。一个不幸的设计选择。

旧的java.util.Date/.Calendar类非常麻烦。避免他们。在Java 8及更高版本中,使用内置的java.time框架。由JSR 310定义,由ThreeTen-Extra项目扩展。请参阅Tutorial

UTC

基本上UTC在这种情况下与GMT相同。

java.time

java.time框架包含类LocalDate,用于仅限日期的值,没有时间或时区。

请注意,即使内部没有存储时区,获取当前日期也需要时区。对于任何特定时刻,日期在世界各地按时区变化,在东部早些时候开始新的一天。

使用proper time zone name。切勿使用EST之类的3-4个字母代码,因为它们既不标准也不唯一。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );

LocalDate::toString方法以标准ISO 8601格式生成字符串:2016-01-23。

约达时间

如果您无法使用Java 8技术,请添加非常成功的Joda-Time库。 Joda-Time启发了java.time。

在这种情况下,代码与上面的代码类似。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
LocalDate localDate = new LocalDate( zone );