Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串格式设置为UTC+;Java中的0_Java_Date_Datetime_Time_Java 8 - Fatal编程技术网

将字符串格式设置为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现在被类取代。看,我希望这本书对你有用。不要忘记将答案标记为已接受,以便将来的访问者也可以自信地使用该解决方案。要将答案标记为已接受,您需要单击大复选标记(✓) 在答案的左边。您也可以查看以了解更多信息。如果有任何疑问/问题,请随时在此发表评论。