Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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
SimpleDataFormat到java.time_Java_Time_Simpledateformat_Datetime Format - Fatal编程技术网

SimpleDataFormat到java.time

SimpleDataFormat到java.time,java,time,simpledateformat,datetime-format,Java,Time,Simpledateformat,Datetime Format,我试图了解Java 8日期/时间框架是如何工作的。 实际上,我使用SimpleDataFormat以这种方式返回给定字符串的毫秒数: new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(builder.toString()).getTime(); Java 8中的新类会变成什么样子?您可以使用: ZonedDateTime date = ZonedDateTime.parse("mydate",DateTimeFormatter.ofPattern(

我试图了解Java 8日期/时间框架是如何工作的。
实际上,我使用SimpleDataFormat以这种方式返回给定字符串的毫秒数:

new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(builder.toString()).getTime();
Java 8中的新类会变成什么样子?

您可以使用:

ZonedDateTime date = ZonedDateTime.parse("mydate",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
System.out.println(date.toInstant().toEpochMilli());

您指定的模式在Java-8中无法工作。问题在于似乎没有后端端口,但Java-9尚未发布

Java-8可能的解决方法包括笨拙的字符串预处理,即在分数部分之前插入十进制分隔符,或下载其他第三方库(根据我的观察,解析器可能比Java-9更快):

字符串预处理

String mydate = "20130812214600025";
String adjustedInput = new StringBuilder(mydate).insert(14, '.').toString();
ZonedDateTime date =
    ZonedDateTime.parse(
        adjustedInput,
        DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SSS").withZone(ZoneOffset.systemDefault()));
System.out.println(date); // 2013-08-12T21:46:00.025+02:00[Europe/Berlin]
System.out.println(date.toInstant().toEpochMilli()); // 1376336760025
乔达时间

String mydate = "20130812214600025";
DateTime date =
    DateTime.parse(
        mydate,
        DateTimeFormat.forPattern("yyyyMMddHHmmssSSS"));
System.out.println(date); // 2013-08-12T21:46:00.025+02:00
System.out.println(date.toInstant().getMillis()); // 1376336760025
我的图书馆

供您参考:时区是必需的,因为我们将年、月、日、小时等本地详细信息转换为全局即时信息,但您的输入不包含任何区域或偏移信息。因此,有必要为格式化程序提供区域或偏移量


如您所见,
SimpleDateFormat
和Joda Time默认(隐式)使用系统时区。但是,
java.time
-API和Time4J需要显式地指定时区(IMHO是更干净的设计)

这给了我:无法在索引0处解析文本“20140920111703000”。您所需的格式接近标准格式。我强烈建议坚持使用标准格式,而不是自己发明。该标准的设计是明智的,以避免歧义。默认情况下,java.time类中使用这些函数来解析/生成字符串。您的格式接近“基本”版本,最大限度地减少了分隔符的使用。为了完全符合要求,(a)在年-月-日和小时-分钟-秒部分之间插入a
T
,以及(b)在小数点前插入逗号(最好)或句号(句点)。
long millisSinceUnix =
    ChronoFormatter.ofPattern(
        "yyyyMMddHHmmssSSS",
        PatternType.CLDR,
        Locale.ROOT,
        Moment.axis(TemporalType.MILLIS_SINCE_UNIX)
    ).with(Timezone.ofSystem()).parse(mydate).longValue();
System.out.println(millisSinceUnix); // 1376336760025