Java 将UTC日期转换为当前时区

Java 将UTC日期转换为当前时区,java,android,date,Java,Android,Date,我必须将2016-09-25 17:26:12格式的UTC日期转换为Android的当前时区。我这样做: SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date myDate = simpleDateFormat.parse(temp.getString("date

我必须将2016-09-25 17:26:12格式的UTC日期转换为Android的当前时区。我这样做:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(temp.getString("date"));
System.out.println(mydate.toString());
这是可行的,但我不知道为什么它也会打印GMT+02:00。 这是输出:Sun Sep 25 19:26:12 GMT+02:00 2016,我不想显示GMT+02:00

编辑,解决方案的代码:

您可以使用:

system.out.println(myDate.getDay()+" "+myDate.getMonth()+" "+myDate.getYear());
放置您需要的东西

您可以使用:

system.out.println(myDate.getDay()+" "+myDate.getMonth()+" "+myDate.getYear());

把你需要的东西放进去

你可以用设置时区的方法来做

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));

您可以使用设置时区的方法来完成

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));

它打印GMT+02,因为这是您的本地时区。 如果要打印没有时区信息的日期,请使用SimpleDataFormat将日期格式化为您喜欢的格式

编辑:使用变量“myDate”添加代码示例

SimpleDateFormat inputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
inputSDF.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = inputSDF.parse("2016-09-25 17:26:12");
//
SimpleDateFormat outputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(outputSDF.format(myDate));
System.out.println(TimeZone.getDefault().getID());
在我的本地时区的我的控制台上屈服

2016-09-25 19:26:12
Europe/Paris

它打印GMT+02,因为这是您的本地时区。 如果要打印没有时区信息的日期,请使用SimpleDataFormat将日期格式化为您喜欢的格式

编辑:使用变量“myDate”添加代码示例

SimpleDateFormat inputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
inputSDF.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = inputSDF.parse("2016-09-25 17:26:12");
//
SimpleDateFormat outputSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(outputSDF.format(myDate));
System.out.println(TimeZone.getDefault().getID());
在我的本地时区的我的控制台上屈服

2016-09-25 19:26:12
Europe/Paris
下面是Date类的toString实现:

如果您看到,它会在日期后附加时区信息。如果不希望打印,可以使用SimpleDataFormat将日期转换为字符串,例如:

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(format.format(new Date()));
下面是Date类的toString实现:

如果您看到,它会在日期后附加时区信息。如果不希望打印,可以使用SimpleDataFormat将日期转换为字符串,例如:

SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(format.format(new Date()));
tl;博士 避免遗留日期时间类 您使用的是与最早版本的Java捆绑在一起的麻烦的旧日期时间类。现在被java.time类取代

ISO 8601 您输入的字符串几乎符合java.time类默认使用的标准格式。用T.

替换中间的空间 LocalDateTime 输入缺少或的任何指示。因此,我们将解析为一个

抵销日期时间 您声称从应用程序的上下文中知道此日期时间值的用途。因此,我们将该偏移量指定为常数,使其成为a

分区截止时间 在本例中,您还表示希望将该值调整为用户JVM或Android运行时的当前默认时区。知道此默认值可以在应用程序执行期间随时更改。如果时区很关键,则应明确要求用户提供所需/预期的时区。ZoneId类表示时区

ZoneId z = ZoneId.systemDefault(); // Or, for example: ZoneId.of( "America/Montreal" )
ZonedDateTime zdt = odt.atZoneSameInstant( z );
生成字符串 你说你想生成一个字符串来表示这个日期时间值。您可以指定所需的任何格式。但通常最好让java.time根据对象中定义的人类语言和文化规范自动本地化。用于指定长度或缩写全、长、短

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步调整为在中

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

tl;博士 避免遗留日期时间类 您使用的是与最早版本的Java捆绑在一起的麻烦的旧日期时间类。现在被java.time类取代

ISO 8601 您输入的字符串几乎符合java.time类默认使用的标准格式。用T.

替换中间的空间 LocalDateTime 输入缺少或的任何指示。因此,我们将解析为一个

抵销日期时间 您声称从应用程序的上下文中知道此日期时间值的用途。因此,我们将该偏移量指定为常数,使其成为a

分区截止时间 在本例中,您还表示希望将该值调整为用户JVM或Android运行时的当前默认时区。知道此默认值可以在应用程序执行期间随时更改。如果时区很关键,则应明确要求用户提供所需/预期的时区。ZoneId类表示时区

ZoneId z = ZoneId.systemDefault(); // Or, for example: ZoneId.of( "America/Montreal" )
ZonedDateTime zdt = odt.atZoneSameInstant( z );
生成字符串 你说你想生成一个字符串来表示这个日期时间值。您可以指定所需的任何格式。但通常最好让java.time根据对象中定义的人类语言和文化规范自动本地化。用于指定长度或缩写全、长、短

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。 并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步调整为在中



该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

您还没有显示任何打印出任何内容的内容。。。如果要打印myDate.toString,Date.toString就是这样做的。基本上,您应该使用另一个SimpleDateFormat来实现所需的输出。是的,我正在打印myDate.ToString,所以不要这样做。使用SimlleDateFormat对其进行格式化。您尚未显示任何打印出来的内容。。。如果要打印myDate.toString,Date.toString就是这样做的。基本上,您应该使用另一个SimpleDateFormat来实现所需的输出。是的,我正在打印myDate.ToString,所以不要这样做。使用SimlleDateFormat对其进行格式化。这应该可以,但我认为这不是最好的解决方案编辑:您所说的方法在Android中不受欢迎这应该可以,但我认为这不是最好的解决方案编辑:您所说的方法在Android中不受欢迎这是我正在做的,转换工作,但它将GMT+02:00添加到输出中,我不想要它。尝试使用TimeZone.getDefault.GetDisplayName是我正在做的,转换工作,但它会将GMT+02:00添加到输出中,我不想要它。尝试使用TimeZone.getDefault.GetDisplayName你能写代码吗,请,我希望日期的格式是yyyy MM dd HH:MM:SS这样做输出是UTC时区,而不是我的时区,另外,如果我确实输出df.setTimeZoneTimeZone.getTimeZoneUTC;在不调用setTimeZone方法的情况下创建SimpleDataFormat实例意味着SDF实例将具有与JVM系统相同的时区。显示当您打印myDate.toString并在GMT+02:00结束时,我可以保证您应该创建的实例默认将具有您的本地时区。那是除非你是在重用你用UTC创建的实例来进行解析。谢谢,我的错误是我重用了用UTCyou创建的实例,请注意,java Date对象没有时区概念,因此当您想将日期“点”转换为时区的人工时间表示形式时,也应该使用SimpleDateFormat。又名:格式化日期:您能编写代码吗,我希望日期的格式为yyyy-MM-dd HH:MM:ss执行此操作时,输出是UTC时区,而不是我的时区,如果我输出sdf.setTimeZoneTimeZone.getTimeZoneUTC;在不调用setTimeZone方法的情况下创建SimpleDataFormat实例意味着SDF实例将具有与JVM系统相同的时区。显示当您打印myDate.toString并在GMT+02:00结束时,我可以保证您应该创建的实例默认将具有您的本地时区。那是除非你是在重用你用UTC创建的实例来进行解析。谢谢,我的错误是我重用了用UTCyou创建的实例,请注意,java Date对象没有时区概念,因此当您想要将日期“点”转换为时区的人工时间表示形式时,也应该使用SimpleDateFormat,即aka:formatted Date:Only doing myDate.toString,它在我的时区中应用转换,使用格式时,它仍然在执行myDate.toString,它在我的时区中应用转换,使用格式时,它仍然是UTCMy Project当前使用的java7,并且它没有您使用的某些类,我将在我将项目移动到java8后尝试,感谢您的回答。@master94ga重新阅读我答案中倒数第二段,关于和。@BasilBourque疯狂地发射。。。谢谢你,朋友,你还遭受了一种叫做时区地狱和日期格式疯狂的人类愚蠢行为:我的项目目前使用的是java7,而它没有你使用的一些类,我将在我将项目迁移到java8后尝试,谢谢你的回答。@master94ga重新阅读我答案中倒数第二段,关于和。@BasilBourque疯狂地发射。。。谢谢你,朋友,你还遭受了人类的愚蠢行为,名为时区地狱和日期格式疯狂:
Locale locale = Locale.getDefault();  // Or, for example: Locale.CANADA_FRENCH
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale );
String output = zdt.format( f );