Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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 如何将Datetime字符串转换为";yyyy-MM-dd';T';HH:mm:ss.SSSSS Z“;_Java_Scala_Apache Spark - Fatal编程技术网

Java 如何将Datetime字符串转换为";yyyy-MM-dd';T';HH:mm:ss.SSSSS Z“;

Java 如何将Datetime字符串转换为";yyyy-MM-dd';T';HH:mm:ss.SSSSS Z“;,java,scala,apache-spark,Java,Scala,Apache Spark,我已经创建了下面的函数 def toUTCDate(dateString:String):选项[String]={ val parser=DateTimeFormatter.of模式(“dd/MM/yyyy HH:MM:ss”) val formatter=DateTimeFormatter.of模式(“yyyy-MM-dd'HH:MM:ss.SSZ”) 试一试{ parse(日期字符串,解析器) }.toOption .map(u.format(格式化程序)) } 上面代码的问题是它希望输入

我已经创建了下面的函数

def toUTCDate(dateString:String):选项[String]={
val parser=DateTimeFormatter.of模式(“dd/MM/yyyy HH:MM:ss”)
val formatter=DateTimeFormatter.of模式(“yyyy-MM-dd'HH:MM:ss.SSZ”)
试一试{
parse(日期字符串,解析器)
}.toOption
.map(u.format(格式化程序))
}
上面代码的问题是它希望输入有一些时区,但我的输入是日期时间字符串

Sample input : "13/02/2017 16:05:45"
Expected output: "2017-02-13T16:05:45.000000000+01:00

正如您所说,您的问题是您使用的是
ZonedDateTime
,但您的字符串没有时区

您可以通过导入
ZoneId
在解析器构造中应用默认时区

我在下面的示例中使用了UTC,但您可以使用GMT+1或您想要的任何区域

import java.time.ZoneId
val parser = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss").withZone(ZoneId.of("UTC"))
parser: java.time.format.DateTimeFormatter = Value(DayOfMonth,2)'/'Value(MonthOfYear,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)

scala> ZonedDateTime.parse(input, parser)
res12: java.time.ZonedDateTime = 2017-02-13T16:05:45Z[UTC]

scala> ZonedDateTime.parse(input, parser).format(formatter)
res13: String = 2017-02-13T16:05:45.000000000+0000
可以使用ZoneId.GetAvailableZoneId方法获取可用的ZoneId

ZoneId.getAvailableZoneIds
res14: java.util.Set[String] = [Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Africa/Cairo, Pacific/Pago_Pago, Africa/Mbabane, Asia/Kuching, Pacific/Honolulu, Pacific/Rarotonga, America/Guatemala, Australia/Hobart, Europe/London, America/Belize, America/Panama, Asia/Chungking, America/Managua, America/Indiana/Petersburg, Asia/Yerevan, Europe/Brussels, GMT, Europe/Warsaw, America/Chicago, Asia/Kashgar, Chile/Continental, Pacific/Yap, CET, Etc/GMT-1, Etc/GMT-0, Europe/Jersey, America/Tegucigalpa, Etc/GMT-5, Europe/Istanbul, America/Eirunepe, Etc/GMT-4, America/Miquelon, Etc/GMT-3, Europe/Luxembourg, Etc/GMT-2, Etc/GMT-9, America/Argentina/Catamarca, Etc/GMT-8, Etc/GMT-7, Etc/GMT-6, Euro...
因此,您的代码将产生如下结果:

def toUTCDate(dateString: String): Option[String] = {
    val parser = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss").withZone(ZoneId.of("UTC"))
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSSZ")

    Try {
      ZonedDateTime.parse(dateString, parser)
    }.toOption
      .map(_.format(formatter))
  }

请分享样本输入和预期输出。我已使用相同的样本输入更新了问题:“13/02/2017 16:05:45”样本输出:“2017-02-13T16:05:45.000000000+01:00谢谢你的帮助,这正是我想要的。我不知道ZoneID,所以我正在进行字符串操作以添加区域信息,但这是必需的解决方案。(Y)