将字符串格式设置为UTC+;Java中的0
我想用将字符串格式设置为UTC+;Java中的0,java,date,datetime,time,java-8,Java,Date,Datetime,Time,Java 8,我想用UTC+0将字符串date-2017-01-01转换为java.util.date。所以,我期待的是 “2017-01-01”->2017-01-01T00:00:00 UTC+0100 下面是我尝试的方法,但由于我的默认时区是UTC+1,我将在日期中添加1小时 Date d = Date.from(Instant.parse("2017-01-01T00:00:00Z")); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'
UTC+0
将字符串date-2017-01-01
转换为java.util.date
。所以,我期待的是
“2017-01-01”->2017-01-01T00:00:00 UTC+0100
下面是我尝试的方法,但由于我的默认时区是UTC+1,我将在日期中添加1小时
Date d = Date.from(Instant.parse("2017-01-01T00:00:00Z"));
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss 'UTC'ZZZZZ");
String output = sf.format(d);
System.out.println(output);
以下是输出:
2017-01-01T01:00:00 UTC+0100
有人能帮忙吗?你可以先设置时区,然后格式化
sf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sf.parse(d);
现在根据您的要求设置格式:
String output = sf.format(date);
System.out.println(output);
我想知道,请也试试这个:
Date date = new Date();
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
date = cal.getTime();
您的代码混合了老式类和现代类<代码>日期和简化格式早已过时<代码>即时是现代的(从2014年开始)。我建议您坚持使用现代的API,除非您使用的是需要和/或提供老式类实例的旧API。所以答案是
String output = LocalDate.parse("2017-01-01")
.atStartOfDay(ZoneOffset.ofHours(1))
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss 'UTC'XX"));
结果就是你要求的结果
2017-01-01T00:00:00 UTC+0100
代码并不比你的短,但一旦你习惯了流畅的风格,你会发现它更清晰、更自然。混乱和错误的空间大大减少了
如果您希望在用户所在的任何时区开始一天,只需填写ZoneId.systemDefault()
,而不是ZoneOffset.ofHours(1)
LocalDate
解析您的日期字符串-“2017-01-01”
-无需显式格式。字符串符合ISO 8601,现代类使用此标准作为解析的默认值,也用于它们的toString()
在调用sf.format(d)之前,将SimpleDateFormat
上的时区设置为UTC代码>。请注意,Date
对象不包含时区信息-它们只是1970年1月1日00:00:00 UTC以来的毫秒数。您的日期
对象本身不知道它在UTC中。另外:为什么要将旧的Date
和SimpleDateFormat
API与新的java.time
API混合使用?使用java.time
,而不是旧的API.Aaaah。是的,你说得对。我真蠢。这不是你要问的,但请允许我提一下:使用新的Java数据和时间API,混淆的风险要小得多。考虑使用<代码>本地日期< /代码>,并免除对小时或时区或任何事情的困扰。FYI,麻烦的旧日期时间类,例如,和<代码> java .Text。SimultExtFrase现在被类取代。看,我希望这本书对你有用。不要忘记将答案标记为已接受,以便将来的访问者也可以自信地使用该解决方案。要将答案标记为已接受,您需要单击大复选标记(✓) 在答案的左边。您也可以查看以了解更多信息。如果有任何疑问/问题,请随时在此发表评论。