我有一个日期时间,格式为2019年4月30日星期二16:00:00 0800,这是RFC 2822格式的日期
我需要将其转换为日期时间0800中的给定时区
如果我总结一下,
DateGiven = Tue, 30 Apr 2019 16:00:00 +0800
DateWanted = 01-05-2019 00:00:00
如何在Java中实现这一点?我已经尝试了下面的代码,但它给出的时间比当前时间短08小时,即
30-04-2019 08:00:00
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date startDate = format.parse(programmeDetails.get("startdate").toString());
//Local time zone
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
//Time in GMT
Date dttt= dateFormatLocal.parse( dateFormatGmt.format(startDate) );
在@ole v.v的解释的帮助下,我将两个1的datetime值分离了出来。时间2。时区
然后,我使用这种编码来提取与给定时区相关的日期时间
//convert datetime to give timezone
private static String DateTimeConverter (String timeVal, String timeZone)
{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat offsetDateFormat2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
offsetDateFormat2.setTimeZone(TimeZone.getTimeZone(timeZone));
String result =null;
try {
result = offsetDateFormat2.format(format.parse(timeVal));
} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
你误会了。根据RFC 28220800
,与UTC相比,该时间已经应用了8小时0分钟的偏移量。所以你得到的输出是正确的GMT时间。
我建议您跳过旧的和过时的类SimpleDataFormat和Date。使用java更好。时间,现代Java日期和时间API。此外,它内置了RFC格式,因此我们不需要编写自己的格式化程序。
OffsetDateTime parsedDateTime = OffsetDateTime
.parse("Tue, 30 Apr 2019 16:00:00 +0800",
DateTimeFormatter.RFC_1123_DATE_TIME);
ZonedDateTime dateTimeInSingapore
= parsedDateTime.atZoneSameInstant(ZoneId.of("Asia/Singapore"));
System.out.println("In Singapore: " + dateTimeInSingapore);
OffsetDateTime dateTimeInGmt
= parsedDateTime.withOffsetSameInstant(ZoneOffset.UTC);
System.out.println("In GMT: " + dateTimeInGmt);
输出:
In Singapore: 2019-04-30T16:00+08:00[Asia/Singapore]
In GMT: 2019-04-30T08:00Z
内置格式化程序被命名为RFC_1123_DATE_TIME
,因为在多个评论请求(RFC)中使用了相同的格式。
您的方法是正确的,但只需使用java-8日期时间API模块,首先使用输入格式表示创建日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z");
然后使用OffsetDateTime来解析带有偏移量的字符串
OffsetDateTime dateTime = OffsetDateTime.parse("Tue, 30 Apr 2019 16:00:00 +0800",formatter);
并调用toLocalDateTime()
方法获取本地时间
LocalDateTime localDateTime = dateTime.toLocalDateTime(); //2019-04-30T16:00
如果您想再次以特定格式输出,您可以使用DateTimeForware
localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) //2019-04-30T16:00:00
注意:在将输入字符串解析为util之后,正如@olev.V在注释中指出的那样。获取UTC时间的日期
Date类表示特定的时间瞬间,精度为毫秒。
因此,如果现在将解析的日期时间转换为UTC,则得到没有偏移的2019-04-30T08:00Z,因此可以使用withOffsetSameInstant将其转换为任何特定时区
dateTime.withOffsetSameInstant(ZoneOffset.UTC)
问题内容: 我想将此GMT时间戳转换为GMT + 13: 我已经尝试过约100种不同的DateFormat,TimeZone,Date,GregorianCalendar等组合,以尝试执行此非常基本的任务。 这段代码可以满足我在当前时间的需求: 但是我想要的是设置时间而不是使用当前时间。 我发现任何时候我都尝试这样设置时间: 使用本地计算机的TimeZone。这是为什么?我知道,当“ new Da
问题内容: 如何将Unix时间戳中的时间转换为正常时间? 问题答案: 您的问题含糊不清。我将消除时区的歧义。 如何将Unix时间戳中的时间转换为正常时间? 我怀疑您是以某种方式从数据库而不是从中获取或一个值。在JDBC中,通常希望使用适当的方法来获取特定于DB的数据类型。可以获取MySQL 数据类型,从而为您提供,而后者又是的子类。 简而言之,应该执行以下操作: 要将其呈现给最终用户时,要以人类可
但问题是我无法将数据从Firebase转换为Local。save方法将转换为Timestamp fine。 任何解决办法。
我正在尝试转换java。util。日期至java。时间本地日期: 但是,当有例如22:25的一天时间时,我选择ZoneId,例如:。 即将推出的本地日期将有不同的日期(因为该区域增加了6小时),例如欧洲/明斯克: 我想在结果的LocalDate中保留与该实例相同的日期。一些方法如何解决这个问题?我想可能有几种方法。
问题内容: 在这里约会我的问题: 我知道该字符串位于UTC时区。我需要将此字符串转换为“ yyy-mm-dd’T’HH:mm:ssZ”格式。 为此,我使用以下代码: 问题是此代码在时区UTC + 1的服务器上运行,其结果是: 它从初始时间删除2小时,并放置UTC时间戳(0000)。 你能帮我解决这个问题吗?谢谢。 问题答案: 如果输出格式为UTC + 1,则应在外包格式器中使用该格式,而不是UTC