我知道Java日期是无时区的,尝试在Java日历上设置不同的时区不会将日期转换为适当的时区。所以我尝试了以下代码
public static String DATE_FORMAT="dd MMM yyyy hh:mm:ss";
public static String CURRENT_DATE_STRING ="31 October 2011 14:19:56 GMT";
DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(dateFormat.parseObject(CURRENT_DATE_STRING));
但是在必须为Mon Oct 31 16:19:56
的情况下输出错误的日期12:19:56
?
这里的主要问题是您的日期格式字符串使用的是hh(12小时制)而不是HH(24小时制)
第二,您的日期格式应指定您的日期字符串包含时区。(或者,您可以取消注释行,以告诉它正确的时区)。
第三,您应该使用DateFormat来输出屏幕显示时间以及...
最后,UTC = GMT,所以UTC时间也是14:19:56
((格林尼治标准时间,“英国冬季时间”与UTC相同,而BST提前一小时)
public class DateFormatTest {
public static String DATE_FORMAT="dd MMM yyyy HH:mm:ss z";
public static String CURRENT_DATE_STRING ="31 October 2011 14:19:56 GMT";
public static void main(String[] args) throws ParseException {
DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
//dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
Date d= dateFormat.parse(CURRENT_DATE_STRING);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(dateFormat.format(d));
}
}
输出:31 Oct 2011 14:19:56 UTC
HTH
使用Joda Time。许多StackOverflow用户都推荐使用此方法,并且在时区转换示例中对此进行了详细记录。
祝你好运!
整个输出是什么? Date.toString()应该打印时区。也许在您的情况下不在UTC中。
我了解Java日期是无时区的
实际上,java.util.Date
代表以UTC表示的时刻,零小时-分钟-秒的偏移量。
[提防Date::toString
。可怕的toString
方法会在生成文本时动态应用JVM当前的默认时区。这会造成该时区已经成为对象一部分的错觉。永远不要使用此类的许多原因之一。
尝试在Java日历上设置其他时区不会将日期转换为合适的时区
您应该使用现代的java.time类,而不要使用Calendar
。具体来说,使用ZonedDateTime
代表某个特定区域(时区)的人们所使用的挂钟时间所看到的时刻。
“ 2011年10月31日格林威治标准时间14:19:56”;
您输入的"31 October 2011 14:19:56 GMT"
与您的格式化格式"dd MMM yyyy hh:mm:ss"
不匹配。该模式无法解决您输入的偏移量,偏移量为零小时-分钟-秒,最后由GMT
表示。
首先,请勿使用此类格式交换日期时间值。学习使用ISO 8601标准格式交换日期时间值作为文本。 java.time类在解析/生成文本时默认情况下方便地使用这些标准格式,因此根本不需要指定模式。
但是,如果您必须解析您的特定输入字符串,请定义一个匹配的格式化模式。
String input = "31 October 2011 14:19:56 GMT";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd MMMM uuuu HH:mm:ss z" , locale );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
注意我们如何指定Locale
,以确定在翻译您的输入内容时所使用的人类语言和文化规范。
显然,您想查看一下在东欧时区看到的这一刻。我将在该区域中任意选择一个时区。
ZoneId zoneHelsinki = ZoneId.of( "Europe/Helsinki" );
ZonedDateTime zdtHelsinki = zdt.withZoneSameInstant( zoneHelsinki );
转储到控制台。
System.out.println( "zdt = " + zdt );
System.out.println( "zdtHelsinki = " + zdtHelsinki );
zdt = 2011-10-31T14:19:56Z [GMT]
zdtHelsinki = 2011-10-31T16:19:56 + 02:00 [欧洲/赫尔辛基]
注意小时是如何从14
更改为16
的,因为那时芬兰的时钟比UTC早两个小时。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,java.util.Date
和Calendar
。
要了解更多信息,请参见Calendar
。并在Stack Overflow中搜索许多示例和说明。规格为SimpleDateFormat
。
SimpleDateFormat
项目现在位于Oracle Tutorial中,建议迁移到JSR 310类。
您可以直接与数据库交换java.time对象。使用兼容Joda-Time或更高版本的maintenance mode。不需要字符串,不需要java.time类。
从哪里获取java.time类?
java.sql.*
,Java SE 8和更高版本-具有捆绑实施的标准Java API的一部分。Interval
。