java8日期转时间戳_Java 8日期和时间

java8日期转时间戳

如今,一些应用程序仍在使用java.util.Datejava.util.Calendar API,包括使我们的生活更轻松地使用这些类型的库,例如JodaTime。 但是,Java 8引入了新的API来处理日期和时间,这使我们可以对日期和时间表示进行更精细的控制,为我们提供不可变的datetime对象,更流畅的API以及在大多数情况下提高性能,而无需使用其他库。 让我们看一下基础知识。

LocalDate / LocalTime / LocalDateTime

让我们开始与最相关的新API的java.util.DateLocalDate ,日期的API,表示没有时间的日期; LocalTime ,不带日期的时间表示; 和LocalDateTime ,这是前两个的组合。 所有这些类型都代表一个区域的本地日期和/或时间,但是,就像java.util.Date一样,它们包含表示该区域的信息,仅表示当前日期和时间。时区。

首先,这些API支持简单的实例化:

LocalDate date = LocalDate.of(2018,2,13);
// Uses DateTimeformatter.ISO_LOCAL_DATE for which the format is: yyyy-MM-dd
LocalDate date = LocalDate.parse("2018-02-13");LocalTime time = LocalTime.of(6,30);
// Uses DateTimeFormatter.ISO_LOCAL_TIME for which the format is: HH:mm[:ss[.SSSSSSSSS]]
// this means that both seconds and nanoseconds may optionally be present.
LocalTime time = LocalTime.parse("06:30");LocalDateTime dateTime = LocalDateTime.of(2018,2,13,6,30);
// Uses DateTimeFormatter.ISO_LOCAL_DATE_TIME for which the format is the
// combination of the ISO date and time format, joined by 'T': yyyy-MM-dd'T'HH:mm[:ss[.SSSSSSSSS]]
LocalDateTime dateTime = LocalDateTime.parse("2018-02-13T06:30");

在它们之间进行转换很容易:

// LocalDate to LocalDateTime
LocalDateTime dateTime = LocalDate.parse("2018-02-13").atTime(LocalTime.parse("06:30"));// LocalTime to LocalDateTime
LocalDateTime dateTime = LocalTime.parse("06:30").atDate(LocalDate.parse("2018-02-13"));// LocalDateTime to LocalDate/LocalTime
LocalDate date = LocalDateTime.parse("2018-02-13T06:30").toLocalDate();
LocalTime time = LocalDateTime.parse("2018-02-13T06:30").toLocalTime();

除此之外,使用`plus`和`minus`方法以及一些实用程序功能,对我们的日期和时间表示进行操作非常容易:

LocalDate date = LocalDate.parse("2018-02-13").plusDays(5);
LocalDate date = LocalDate.parse("2018-02-13").plus(3, ChronoUnit.MONTHS);LocalTime time = LocalTime.parse("06:30").minusMinutes(30);
LocalTime time = LocalTime.parse("06:30").minus(500, ChronoUnit.MILLIS);LocalDateTime dateTime = LocalDateTime.parse("2018-02-13T06:30").plus(Duration.ofHours(2));// using TemporalAdjusters, which implements a few useful cases:
LocalDate date = LocalDate.parse("2018-02-13").with(TemporalAdjusters.lastDayOfMonth());

现在我们如何从java.util.Date移到LocalDateTime及其变体? 好吧,这很简单:我们可以将Date类型转换为Instant类型,该类型表示从1970年1月1日开始的时间,然后我们可以使用Instant和当前区域实例化LocalDateTime

LocalDateTime dateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());

要转换回日期,我们可以简单地使用Java 8时间类型表示的Instant。 但是要注意的一件事是,尽管LocalDateLocalTimeLocalDateTime不包含任何Zone或Offset信息,但它们确实表示特定区域中的本地日期和/或时间,因此它们确实保留了当前的偏移量。在那个地区。 因此,我们需要提供一个偏移量以将特定类型正确转换为Instant。

// represents Wed Feb 28 23:24:43 CET 2018
Date now = new Date();// represents 2018-02-28T23:24:43.106
LocalDateTime dateTime = LocalDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault());// represent Wed Feb 28 23:24:43 CET 2018
Date date = Date.from(dateTime.toInstant(ZoneOffset.ofHours(1)));
Date date = Date.from(dateTime.toInstant(ZoneId.systemDefault().getRules().getOffset(dateTime)));

时间差异–持续时间和期间

您已经注意到,在以上示例之一中,我们使用了Duration对象。 DurationPeriod是两个日期之间时间的两种表示形式,前者表示以秒和纳秒为单位的时间差,后者以天,月和年表示。

什么时候应该使用这些? Period ,当你需要知道两者之间的时间差LocalDate陈述:

Period period = Period.between(LocalDate.parse("2018-01-18"), LocalDate.parse("2018-02-14"));

您在寻找具有时间信息的表示形式之间的差异时的Duration时间:

Duration duration = Duration.between(LocalDateTime.parse("2018-01-18T06:30"), LocalDateTime.parse("2018-02-14T22:58"));

使用toString()输出PeriodDuration ,将基于ISO-8601标准使用特殊格式。 周期使用的模式是PnYnMnD,其中n定义周期内存在的年,月或日的数量。 这意味着P1Y2M3D定义为1年2个月3天。 。 模式中的“ P”是时段指示符,它告诉我们以下格式表示一个时段。 使用该模式,我们还可以使用parse()方法基于字符串创建句点。

// represents a period of 27 days
Period period = Period.parse("P27D");

使用Durations ,由于Java 8不使用相同的模式,因此我们稍微偏离了ISO-8601标准。 ISO-8601定义的模式是PnYnMnDTnHnMn.nS。 这基本上是“ Period模式,带有时间表示形式。 在模式中,T是时间标记,因此后面的部分定义了以小时,分钟和秒为单位的持续时间。

Java的8个使用两种特定模式的Duration ,解析字符串,一当就是PnDTnHnMn.nS Duration ,以及调用时PTnHnMn.nS toString()上的一个方法Duration实例。

最后但并非最不重要的一点是,我们还可以通过使用类型上的相应方法来检索时间段或持续时间的各个部分。 但是,重要的是要知道各种日期时间类型也通过使用ChronoUnit枚举类型来支持此功能。 让我们看一些例子:

// represents PT664H28M
Duration duration = Duration.between(LocalDateTime.parse("2018-01-18T06:30"), LocalDateTime.parse("2018-02-14T22:58"));// returns 664
long hours = duration.toHours();// returns 664
long hours = LocalDateTime.parse("2018-01-18T06:30").until(LocalDateTime.parse("2018-02-14T22:58"), ChronoUnit.HOURS);

使用区域和偏移量– ZonedDateTime和OffsetDateTime

到目前为止,我们已经展示了新的日期API如何使某些事情变得容易一些。 但是,真正与众不同的是在时区上下文中轻松使用日期和时间的能力。 Java 8为我们提供了ZonedDateTimeOffsetDateTime ,第一个是LocalDateTime其中包含特定区域(例如,欧洲/巴黎)的信息,第二个是带有偏移量的LocalDateTime 。 有什么不同? OffsetDateTime使用UTC /格林威治标准时间与指定日期之间的固定时差,而ZonedDateTime指定表示时间的区域,并将考虑夏时制。

转换为以下两种类型都很容易:

OffsetDateTime offsetDateTime = LocalDateTime.parse("2018-02-14T06:30").atOffset(ZoneOffset.ofHours(2));
// Uses DateTimeFormatter.ISO_OFFSET_DATE_TIME for which the default format is
// ISO_LOCAL_DATE_TIME followed by the offset ("+HH:mm:ss").
OffsetDateTime offsetDateTime = OffsetDateTime.parse("2018-02-14T06:30+06:00");ZonedDateTime zonedDateTime = LocalDateTime.parse("2018-02-14T06:30").atZone(ZoneId.of("Europe/Paris"));
// Uses DateTimeFormatter.ISO_ZONED_DATE_TIME for which the default format is
// ISO_OFFSET_DATE_TIME followed by the the ZoneId in square brackets.
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-02-14T06:30+08:00[Asia/Macau]");
// note that the offset does not matter in this case.
// The following example will also return an offset of +08:00
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2018-02-14T06:30+06:00[Asia/Macau]");

在它们之间进行切换时,必须记住,从ZonedDateTime转换为OffsetDateTime将考虑夏时制,而在另一个方向上从OffsetDateTimeZonedDateTime意味着您将没有有关区域区域的信息,也不会对夏时制应用任何规则。 这是因为偏移量未定义任何时区规则,也未绑定到特定区域。

ZonedDateTime winter = LocalDateTime.parse("2018-01-14T06:30").atZone(ZoneId.of("Europe/Paris"));
ZonedDateTime summer = LocalDateTime.parse("2018-08-14T06:30").atZone(ZoneId.of("Europe/Paris"));// offset will be +01:00
OffsetDateTime offsetDateTime = winter.toOffsetDateTime();
// offset will be +02:00
OffsetDateTime offsetDateTime = summer.toOffsetDateTime();OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();OffsetDateTime offsetDateTime = LocalDateTime.parse("2018-02-14T06:30").atOffset(ZoneOffset.ofHours(5));
ZonedDateTime zonedDateTime = offsetDateTime.toZonedDateTime();

现在,如果我们想知道特定时区或偏移时间在我们自己的时区中怎么办? 嗯,为此还定义了一些方便的功能!

// timeInMacau represents 2018-02-14T13:30+08:00[Asia/Macau]
ZonedDateTime timeInMacau = LocalDateTime.parse( "2018-02-14T13:30" ).atZone( ZoneId.of( "Asia/Macau" ) );
// timeInParis represents 2018-02-14T06:30+01:00[Europe/Paris]
ZonedDateTime timeInParis = timeInMacau.withZoneSameInstant( ZoneId.of( "Europe/Paris" ) );OffsetDateTime offsetInMacau = LocalDateTime.parse( "2018-02-14T13:30" ).atOffset( ZoneOffset.ofHours( 8 ) );
OffsetDateTime offsetInParis = offsetInMacau.withOffsetSameInstant( ZoneOffset.ofHours( 1 ) );

如果我们不得不一直在这些类型之间手动进行转换以获取我们需要的类型,那将是一件麻烦事。 这就是Spring框架为我们提供帮助的地方。 Spring为我们提供了许多现成的日期时间转换器,这些日期时间转换器已在ConversionRegistry中注册,可以在org.springframework.format.datetime.standard.DateTimeConverters类中找到。

使用这些转换器时,重要的是要知道它不会转换区域或偏移量之间的时间。 该ZonedDateTimeToLocalDateTimeConverter ,例如,将返回LocalDateTime因为它是在,而不是指定的区域LocalDateTime ,它会在你的应用程序的区域代表。

ZonedDateTime zonedDateTime = LocalDateTime.parse("2018-01-14T06:30").atZone(ZoneId.of("Asia/Macau"));
// will represent 2018-01-14T06:30, regardless of the region your application has specified
LocalDateTime localDateTime = conversionService.convert(zonedDateTime, LocalDateTime.class);

最后但并非最不重要的一点是,您可以查询ZoneId.getAvailableZoneIds()来查找所有可用时区,或使用地图ZoneId.SHORT_IDS ,其中包含一些时区的缩写版本,例如EST,CST等。

格式化–使用

当然,世界各地都使用不同的格式来指定时间。 一个应用程序可能使用MM-dd-yyyy,而另一个应用程序使用dd / MM / yyyy。 一些应用程序希望消除所有混淆,并用yyyy-MM-dd表示其日期。 使用java.util.Date ,我们将快速转向使用多个格式化程序。 但是, DateTimeFormatter类为我们提供了可选的模式,因此我们可以将单个格式化程序用于多种格式! 让我们来看一些例子。

// Let’s say we want to convert all of patterns mentioned above.
// 09-23-2018, 23/09/2018 and 2018-09-23 should all convert to the same LocalDate.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy-MM-dd][dd/MM/yyyy][MM-dd-yyyy]");
LocalDate.parse("09-23-2018", formatter);
LocalDate.parse("23/09/2018", formatter);
LocalDate.parse("2018-09-23", formatter);

模式中的方括号定义了模式中的可选部分。 通过使我们的各种格式成为可选,与字符串匹配的第一个模式将用于转换我们的日期表示形式。 当您使用多种模式时,这可能很难理解,因此让我们看一下使用构建器模式创建DateTimeFormatter方法。

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendOptional( DateTimeFormatter.ofPattern( "yyyy-MM-dd" ) ).optionalStart().appendPattern( "dd/MM/yyyy" ).optionalEnd().optionalStart().appendPattern( "MM-dd-yyyy" ).optionalEnd().toFormatter();

这些是包含多个模式的基础,但是如果我们的模式仅稍有不同,该怎么办? 让我们看一下yyyy-MM-dd和yyyy-MMM-dd。

// 2018-09-23 and 2018-Sep-23 should convert to the same LocalDate.
// Using the ofPattern example we’ve used above will work:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy-MM-dd][yyyy-MMM-dd]" );
LocalDate.parse( "2018-09-23", formatter );
LocalDate.parse( "2018-Sep-23", formatter );// Using the ofPattern example where we reuse the common part of the pattern
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-[MM-dd][MMM-dd]" );
LocalDate.parse( "2018-09-23", formatter );
LocalDate.parse( "2018-Sep-23", formatter );

但是,在转换为字符串时,不应使用支持多种格式的格式化程序,因为当我们使用格式化程序将日期格式化为字符串表示形式时,它还将使用可选模式。

LocalDate date = LocalDate.parse("2018-09-23");
// will result in 2018-09-232018-Sep-23
date.format(DateTimeFormatter.ofPattern("[yyyy-MM-dd][yyyy-MMM-dd]" ));
// will result in 2018-09-23Sep-23
date.format(DateTimeFormatter.ofPattern( "yyyy-[MM-dd][MMM-dd]" ));

由于我们处于21世纪,因此显然我们必须考虑全球化,并且我们希望为用户提供本地化日期。 为确保您的DateTimeFormatter返回特定的语言环境,您只需执行以下操作:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEEE, MMM dd, yyyy" ).withLocale(Locale.UK);DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyy-MMM-dd" ).toFormatter(Locale.UK);

要查找可用的语言环境,可以使用Locale.getAvailableLocales()

现在可能是您收到的日期格式比您使用的类型包含更多的信息。 一旦提供的日期表示形式与该模式不一致,则DateTimeFormatter将引发异常。 让我们仔细研究这个问题以及如何解决它。

// The issue: this will throw an exception.
LocalDate date = LocalDate.parse("2018-02-15T13:45");
// We provide a DateTimeFormatter that can parse the given date representation.
// The result will be a LocalDate holding 2018-02-15.
LocalDate date = LocalDate.parse("2018-02-15T13:45", DateTimeFormatter.ISO_LOCAL_DATE_TIME);

让我们创建一个可以处理ISO日期,时间和日期时间模式的格式化程序。

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendOptional( DateTimeFormatter.ISO_LOCAL_DATE ).optionalStart().appendLiteral( "T" ).optionalEnd().appendOptional( DateTimeFormatter.ISO_LOCAL_TIME ).toFormatter();

现在,我们可以完美地执行以下所有操作:

// results in 2018-03-16
LocalDate date = LocalDate.parse( "2018-03-16T06:30", formatter );
LocalDate date = LocalDate.parse( "2018-03-16", formatter );
// results in 06:30
LocalTime time = LocalTime.parse( "2018-03-16T06:30", formatter );
LocalTime time = LocalTime.parse( "06:30", formatter );
LocalDateTime localDateTime = LocalDateTime.parse( "2018-03-16T06:30", formatter );

现在,下一期是哪里来的? 如果您尝试解析LocalDateTime的日期模式怎么办? 如果您希望使用LocalTime并得到日期表示,反之亦然怎么办?

// will throw an exception
LocalDateTime localDateTime = LocalDateTime.parse("2018-03-16", formatter);
LocalDate localDate = LocalDate.parse("06:30", formatter);

对于这后两种情况,没有一个正确的解决方案,但这取决于您的要求,或者这些日期和时间代表或可能代表什么。 使用TemporalQuery可以找到魔术,您可以使用它为模式的一部分创建默认值。

如果我们以LocalDateTime开头,而您只需要LocalDateLocalTime ,则将收到LocalDateTime的相应部分。 要创建LocalDateTime ,我们需要其保存的日期和时间的默认值。 假设如果您不提供有关日期的信息,我们将返回今天的日期,如果您不提供时间,则将假设您的意思是一天的开始。

由于我们将返回LocalDateTime ,因此不会将其解析为LocalDateLocalTime ,因此让我们使用ConversionService来获取正确的类型。

TemporalQuery<TemporalAccessor> myCustomQuery = new MyCustomTemporalQuery();
// results in 2018-03-16
LocalDateTime localDateTime = conversionService.convert( formatter.parse( "2018-03-16", myCustomQuery ), LocalDateTime.class );
// results in 00:00
LocalTime localTime = conversionService.convert( formatter.parse( "2018-03-16", myCustomQuery ), LocalTime.class );class MyCustomTemporalQuery implements TemporalQuery<TemporalAccessor>
{@Overridepublic TemporalAccessor queryFrom( TemporalAccessor temporal ) {LocalDate date = temporal.isSupported( ChronoField.EPOCH_DAY )? LocalDate.ofEpochDay( temporal.getLong( ChronoField.EPOCH_DAY ) ) : LocalDate.now();LocalTime time = temporal.isSupported( ChronoField.NANO_OF_DAY )? LocalTime.ofNanoOfDay( temporal.getLong( ChronoField.NANO_OF_DAY ) ) : LocalTime.MIN;return LocalDateTime.of( date, time );}
}

使用TemporalQuery ,我们可以检查存在的信息,并为缺少的任何信息提供默认值,从而使我们能够使用应用程序中有意义的逻辑轻松地转换为所需的类型。

要了解如何编写有效的时间模式,请查看DateTimeFormatter文档 。

结论

大多数新功能需要一些时间来理解和习惯,Java 8 Date / Time API也不例外。 新的API使我们能够更好地访问必要的正确格式,以及使用日期时间操作的更加标准化和易读的方式。 使用这些提示和技巧,我们几乎可以涵盖所有用例。

翻译自: https://www.javacodegeeks.com/2018/03/java-8-date-and-time.html

java8日期转时间戳

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML行内元素/行级元素/内联元素/行标签/内联标签/行内标签/行元素

文章目录行内元素的特点行内元素清单可变元素列表inline element. 也叫行级元素、内联元素。行内元素默认设置宽度是不起作用&#xff0c;需设置 display:inline-block 或者 block 才行。 行内元素的特点 可以和其他元素处于一行&#xff0c;不用必须另起一行&#xff1b; 元…

深度学习pytorch--softmax回归(三)

softmax回归的简洁实现获取和读取数据定义和初始化模型softmax和交叉熵损失函数定义优化算法模型评价训练模型小结完整代码前两篇链接: 深度学习pytorch–softmax回归(一) 深度学习pytorch–softmax回归(二) 本文使用框架来实现模型。 获取和读取数据 我们仍然使用Fashion-M…

正则表达式的分类

文章目录一、正则表达式引擎二、正则表达式分类三、正则表达式比较四、Linux/OS X 下常用命令与正则表达式的关系一、正则表达式引擎 正则引擎大体上可分为不同的两类&#xff1a;DFA 和 NFA&#xff0c;而 NFA 又基本上可以分为传统型 NFA 和 POSIX NFA。 DFA(Deterministic …

spock测试_使用Spock测试您的代码

spock测试Spock是针对Java和Groovy应用程序的测试和规范框架。 Spock是&#xff1a; 极富表现力 简化测试的“给定/何时/然后” 语法 与大多数IDE和CI服务器兼容。 听起来不错&#xff1f; 通过快速访问Spock Web控制台&#xff0c;您可以非常快速地开始使用Spock。 当您有…

深度学习pytorch--多层感知机(一)

多层感知机隐藏层激活函数ReLU函数sigmoid函数tanh函数多层感知机小结我们已经介绍了包括线性回归和softmax回归在内的单层神经网络。然而深度学习主要关注多层模型。在本节中&#xff0c;我们将以多层感知机&#xff08;multilayer perceptron&#xff0c;MLP&#xff09;为例…

太阳能板如何串联_光伏板清洁专用的清洁毛刷

光伏发电是利用半导体界面的光生伏特效应将光能直接转变为电能的一种技术。主要由太阳电池板&#xff08;组件&#xff09;、控制器和逆变器三大部分组成。主要部件由电子元器件构成。太阳能电池经过串联后进行封装保护可形成大面积的太阳电池组件&#xff0c;再配合上功率控制…

java 异步等待_Java中的异步等待

java 异步等待编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式&#xff1a;首先做一件事&#xff0c;然后再做另一件事&#xff0c;以防万一出错时再做其他事情。 在许多语言中&#xff0c;承诺已成为协调异步行为的实…

cass生成曲线要素_干货在线 | CASS入门指南——道路断面计算土方

CASS操作指南——道路断面计算土方法小伙伴们赶紧学起来&#xff01;道路类的土方工程&#xff0c;主要用CASS的断面法土方计算之道路断面来计算。整个计算过程主要分为以下四步&#xff1a;菜单截图第一步&#xff1a;绘制道路中心线道路的中心线&#xff0c;一般由直线段和缓…

正则表达式的捕获性分组/反向引用

文章目录分组捕获性分组和反向引用分组 正则的分组主要通过小括号来实现&#xff0c;括号包裹的子表达式作为一个分组&#xff0c;括号后可以紧跟限定词表示重复次数。如下&#xff0c;小括号内包裹的 abc 便是一个分组: // (abc) 表示匹配一个或多个"abc"&#xf…

深度学习pytorch--多层感知机(二)

多层感知机的从零开始实现获取和读取数据定义模型参数定义激活函数定义模型定义损失函数训练模型小结我们已经从上一节里了解了多层感知机的原理。下面&#xff0c;我们一起来动手实现一个多层感知机。首先导入实现所需的包或模块。 import torch import numpy as np获取和读取…

jwt同一会话_在会话中使用JWT

jwt同一会话这个话题已经在黑客新闻&#xff0c;reddit和博客上讨论了很多次。 共识是–请勿使用JWT&#xff08;用于用户会话&#xff09;。 而且我在很大程度上同意对JWT的典型论点 &#xff0c; 典型的“但我可以使其工作……”的解释以及JWT标准的缺陷的批评 。 。 我不会…

表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗?

为了避免一到门口就能够看到全部室内的东西&#xff0c;为了更好的保护家居的隐私&#xff0c;目前有很多人都会在玄关的位置加一个隔断&#xff0c;而玄关隔断什么材质好?在做玄关隔断的时候&#xff0c;有些人觉得做了隔断会太浪费空间了&#xff0c;而玄关隔断必须要做吗?…

深度学习pytorch--多层感知机(三)

使用pytorch框架实现多层感知机和实现softmax回归唯一的不同在于我们多加了一个全连接层作为隐藏层。它的隐藏单元个数为256&#xff0c;并使用ReLU函数作为激活函数。#模型的核心代码为:nn.Linear(num_inputs, num_hiddens),nn.ReLU(),nn.Linear(num_hiddens, num_outputs),

mysql 日期索引的使用_日期使用

mysql 日期索引的使用时区糟透了。 特别是夏令时。 我不介意像与此行为相关的编程错误那样&#xff0c;不停移动时钟或失去一个小时的睡眠。 更糟糕的是Java的旧日期/时间API。 Java社区通过JSR 310公开承认了这一点&#xff0c;该JSR 310代替了Java Date&#xff06;Time API…

axure元件库 文件上传_手把手教你打造一套属于产品经理自己的元件库

之前有篇文章聊完了如何打造一套属于自己的原型图设计规范&#xff0c;今天咱们来聊聊如何打造一套属于自己的元件库。毕竟&#xff0c;每个追求效率的PM&#xff0c;总会拥有一个专属自己的Axure元件库&#xff0c;并不断打磨优化。今天就教大家一步一步创建属于自己的Axure元…

KMP算法笔记

1.KMP算法本质上就是对朴素匹配算法(BF)的一个优化&#xff0c;减少朴素匹配算法中不必要匹配的次数&#xff0c;核心代码和朴素匹配算法差不多&#xff0c;BF是移动字串逐个字符匹配&#xff0c;每次模式串(子串)匹配只移动一个字符单位&#xff0c;而KMP算法是每次模式串匹配…

正则表达式的非捕获性分组

非捕获性分组&#xff0c;通常由一对括号加上 ?: 加上子表达式组成&#xff0c;非捕获性分组不会创建反向引用&#xff0c;就好像没有括号一样。如下: var color "#808080"; var output color.replace(/#(?:\d)/,"$1""~~"); console.log(Re…

Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

如果您不知道&#xff0c; Spring安全性可能会限制用户可以拥有的会话数。 如果要开发Web应用程序&#xff0c;尤其是Java JEE中的安全Web应用程序 &#xff0c;则必须提出与在线银行门户相似的要求&#xff0c;例如&#xff0c; 每个用户一次只能有一个会话&#xff0c;或者每…

prometheus命令_Prometheus 入门

学习安装 Prometheus 监控和警报系统并编写它的查询。-- Michael Zamot(作者)Prometheus 是一个开源的监控和警报系统&#xff0c;它直接从目标主机上运行的代理程序中抓取指标&#xff0c;并将收集的样本集中存储在其服务器上。也可以使用像 collectd_exporter 这样的插件推送…

正则表达式的命名分组

语法格式&#xff1a;(?<name>…) 命名分组也是捕获性分组&#xff0c;它将匹配的字符串捕获到一个组名称或编号名称中&#xff0c;在获得匹配结果后&#xff0c;可通过分组名进行获取。 如下是一个python的命名分组的例子&#xff1a; import re data "#80808…