当前位置: 首页 > 知识库问答 >
问题:

Java转换ISO 8601字符串到日期忽略偏移量

秦博达
2023-03-14
DateTimeFormatter isoFormat = ISODateTimeFormat.dateTimeParser();
Date date = isoFormat.parseDateTime("2020-09-09T09:58:00+0000").toDate();
// Wed Sep 09 05:58:00 EDT 2020

相反,我希望保持相同的日期和时间,如:Wed Sep 09 09:58:00,这样我就可以将这个日期对象分别转换为“yyyy-mm-dd”、“hh:mm:ss”和“yyyy-mm-dd't'hh:mm:ss”格式的字符串。

共有1个答案

赫连子石
2023-03-14

答案的第一个也是最重要的部分是:不要转换为老式的日期。要么坚持Joda-Time,要么迁移到Java.time,现代Java日期和时间API,正如Arvind Kumar Avinash的好答案所述。

既然您已经在使用Joda-Time,我将向您展示一个Joda-Time解决方案。说服格式化程序保留对字符串的时间和偏移量的诀窍是WithoffsetParsed()

    DateTimeFormatter isoFormat
            = ISODateTimeFormat.dateTimeParser().withOffsetParsed();
    String incomingString = "2020-09-09T09:58:00+0000";
    DateTime dateTime = isoFormat.parseDateTime(incomingString);

然而!如果我猜对了,您希望用UTC存储日期和时间(推荐的做法),那么比withoffsetparsed()更好的做法是在解析器上指定UTC:

    DateTimeFormatter isoFormat
            = ISODateTimeFormat.dateTimeParser().withZoneUTC();
    String dateString = dateTime.toString(ISODateTimeFormat.date());
    System.out.println(dateString);
    
    String timeString = dateTime.toString(ISODateTimeFormat.hourMinuteSecond());
    System.out.println(timeString);
    
    String dateTimeString = dateTime.toString(ISODateTimeFormat.dateHourMinuteSecond());
    System.out.println(dateTimeString);

产出:

2020-09-09
09:58:00
2020-09-09T09:58:00

使用date有什么问题?首先,date类设计得很差,而且已经过时很久了。其次,date只是一个时间点,它没有一天中的日期和时间的概念(他们试图在Java1.0中将其融入其中,但在1997年的Java1.1中放弃并不推荐它)。因此,date不能在UTC中保存一天中的日期和时间。

在您的代码中发生的事情是,您得到了一个日期表示正确的时间点。只有在打印date时,才隐式调用了它的tostring方法。date.tostring()混淆了JVM的时区设置(在您的例子中,显然是北美东部时间),并使用它来呈现要返回的字符串。因此,在您的例子中,时间点被呈现为Wed Sep 09 05:58:00美国东部时间2020

 类似资料:
  • 我正在尝试做一个非常简单的任务。将时间(long myTime)以纪元秒为单位转换为字符串(但无需任何调整)。 “reportDate”会根据Windows的GMT偏移量自动调整。我需要即时到字符串的精确转换。我是Java新手。。。。

  • 我有以下代码段来更改日期格式 用相同的日期格式将字符串再次转换回日期的最佳方法是什么

  • 问题内容: 我已经写了这个功能: 当我通过日期以及获取输出日期作为 我要去哪里的时候?还做什么,如果我想只得到和 任何帮助表示赞赏 问题答案: 找到以下解决方案…。发布它,因为它也可以帮助其他人:) 输出: 2014-04-24T11:15:00.000 + 02:00

  • 我有一个日期的字符串格式,但它来自csv文件:20200520T0200,假设它的格式为(yyyyMMdd/T/24小时格式)。 我已经设法读取了csv文件中的行,并将其分离到数组缓冲区中。 我的问题是我不能将字符串格式化成日期,因为我需要使用日期来计算一些值。因为我将使用这个格式化程序来格式化我的arraybuffer的第一个元素的所有值,这是带有字符串“20200406T0300,等等,等等”

  • 问题内容: 我需要有关此java方法的一些建议。此方法的目的是采用表示日期的字符串-该字符串是从EST时区中的日期创建的-并将其转换为UTC时区中的java Date对象。 我看到的问题是dt的值似乎已关闭。例如,如果dateString为‘10 / 16/2012 12:06 PM’-我期望dt(以UTC为单位)的值类似于“ 2012年10月16日,星期二,下午4:06”。取而代之的是,dt的值

  • 问题内容: 给定以下字符串:如何将其转换为对象? 阅读后,我觉得这应该可以,但是不行。 应该注意的是,这没有问题: 但是我坚持下去。我宁愿完全转换它,而不以任何方式更改(或切片)它。 问题答案: 看起来strptime并不总是支持。Python似乎只是调用C函数,而您平台上不支持strptime 。 注意: 从Python 3.2开始,它将始终有效。