Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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
Java 如何使用SimpleDataFormatter将2019-09-18T01:44:35GMT-04:00转换为2019-09-18T01:44:35-04:00_Java_Datetime_Timezone_Gmt - Fatal编程技术网

Java 如何使用SimpleDataFormatter将2019-09-18T01:44:35GMT-04:00转换为2019-09-18T01:44:35-04:00

Java 如何使用SimpleDataFormatter将2019-09-18T01:44:35GMT-04:00转换为2019-09-18T01:44:35-04:00,java,datetime,timezone,gmt,Java,Datetime,Timezone,Gmt,我想将日期和时间转换为用户请求的时区。日期和时间为GMT格式。我尝试获得解决方案,但最终字符串包含结果日期中的GMT字符串,如(2019-09-18T01:44:35GMT-04:00)。我不想在结果输出中使用GMT字符串 public static String cnvtGMTtoUserReqTZ(String date, String format, String timeZone) { // null check if (date == null) ret

我想将日期和时间转换为用户请求的时区。日期和时间为GMT格式。我尝试获得解决方案,但最终字符串包含结果日期中的GMT字符串,如(2019-09-18T01:44:35GMT-04:00)。我不想在结果输出中使用GMT字符串

public static String cnvtGMTtoUserReqTZ(String date, String format, String timeZone) {
    // null check
    if (date == null)
        return null;

    // create SimpleDateFormat object with input format
    SimpleDateFormat sdf = new SimpleDateFormat(format);

    // set timezone to SimpleDateFormat
    sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
    try {
        // converting date from String type to Date type
        Date _date = sdf.parse(date);

        // return Date in required format with timezone as String
        return sdf.format(_date);

    } catch (ParseException e) {
        //log.info("Exception in cnvtGMTtoUserReqTime ::: " + e);
    }
    return null;
}
实际输出:2019-09-18T01:44:35GMT-04:00

预期输出:2019-09-18T01:44:35-04:00

使用以下格式:
fromFormat=“yyyy-mm-dd'HH:mm:sszXXX”
toFormat=“yyyy-mm-dd'HH:mm:ssXXX”

处理日期时间对象,而不是字符串 您的问题以错误的方式提出,这很可能是由于您的程序中存在设计缺陷。在程序中不应将日期和时间作为字符串处理。始终将日期和时间保存在适当的datetime对象中,例如
Instant
OffsetDateTime
ZonedDateTime
。上面提到的类来自java.time,这是现代java日期和时间API,它是我们保存和处理日期时间数据的最佳工具

例如,您的问题可能是:如何将某个时刻转换为用户请求的时区?一个瞬间由一个
Instant
对象表示。问题的答案是:

    ZoneId userRequestedTimeZone = ZoneId.of("America/New_York");

    Instant moment = Instant.parse("2019-09-18T05:44:35Z");
    ZonedDateTime userDateTime = moment.atZone(userRequestedTimeZone);
    System.out.println(userDateTime);
请将您的用户所需的时区替换为我放置在美国/纽约的时区。始终以这种格式给出时区(地区/城市)。当前代码段的输出为:

2019-09-18T01:44:35-04:00[美国/纽约]

假设您不需要输出的
[America/New_York]
部分,请将日期时间格式化为所需的字符串:

    String dateTimeWithNoZoneId = userDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    System.out.println(dateTimeWithNoZoneId);
2019-09-18T01:44:35-04:00

后一种输出为ISO 8601格式。此格式适用于序列化,也就是说,如果需要将datetime转换为机器可读的文本格式,例如用于持久化或与其他系统交换。虽然它也是人类可读的,但它不是您的用户希望看到的。正如我所说,这肯定不是你应该在你的程序中处理和处理的

链接
  • 解释如何使用java.time

伙计。。你使用的格式是什么?请在这里与我们合作。此外,如果您正在使用
sdf
解析并使用
sdf
格式化结果日期,则不会发生任何更改。如果您只想删除
GMT
字符串,为什么还要解析日期呢。你不能从字符串中删除它吗?嗨@DanielBarbarian我可以用“”替换
GMT
,但我想使用SimpleDataFormat Cals你不应该使用
SimpleDataFormat
时区
日期
。这些类设计得很糟糕,而且早已过时,第一个类尤其令人讨厌。而是使用
DateTimeFormatter
ZoneId
和来自的其他类。