SCW Icons
hero bg no divider
Blog

将 jodaTime 移植到 java.time

Cameron Gregor
Published Nov 12, 2021
Last updated on Mar 09, 2026

移民代码(阅读:旧版代码)并不能好玩。如果让它跨越界面极限,则需要花费大量的计划和精力。尽管对于开发者来说,这不是最令人惊讶的兴奋或最令人兴奋的作品,但将遗留代码移植到新的库版本确实需要决心和正确的经历。 Joda-Time 到 java.time 就是这样的移动,需要精心规划和执行。

如果你的Java项目是在 Java SE 8 之后的前端开始的,并且使用日期/时间处理,那它本可以使用 Joda-Time ——一个很不错的库,也是 PRESCISE 8 之后的日期和时间函数的事实上的事实。如果你是 静止不自动 使用 Joda-Time 但想移植到 java.time 然后继续阅读。

Java SE 8 的发布包括一个经过改进的全新标准日期和时间 API,通常称为 java.time (JSR-310)。Joda-Time 项目现在建议移植到 java.time (JSR-310)。

虽然 java.time (JSR-310) 在很大程度上受到 Joda-Time 的启用,但它不向后兼容,概述和术语也发生了变化。这就是为什么从 Joda-Time 移植到 java.time 需要注意你更新的每一行代码的原因。这可能很耗时,几乎可以让你望望有一种更简单、更自动化的移植方式。

有更好的 Sensei 移植方式,我们使用 Sensei 创建了它,Sensei 是一个 IntelliJ 插件,可根据你定义的配方(规则)自动执行代码转换。花时间定义可重复使用的配件,而非执行重复的移植任务。自动化不只能转换你的旧版 Joda-Time 代码,还可以帮忙助手团队在编写 newdaidcodeTime 时遵循 IDE 中的指导方针。

再有帮助你占先机,我们创建了一本公开的 Sensei 食谱 java.time 上面的标准化 (JSR-310) 其中包括 Joda-Time 从 Joda-Time 移植到 java.time 的食谱。这是一套越来越多的食谱,我们将继续扩大其覆盖范围,增加更多食谱。

以下是示例例子移植示例,可以帮您了解 Sensei 如何轻松 Sensei 移植遗留代码。

Video of how to set java.time zoned date time

从重复的手动动画移植到自动代码转换

让我们来看一个创建新 DateTime 的演示示例,该示例演示了我们将单行代码从 Joda-Time 移植到 java.time 时光中的一些隐身藏陷阱。然而之后,我们将查看 java.time Standarizated (JSR-310) 食谱中一位老师的秘密,并展示它是如何捕获所有这些信息的,比如任何开发人员都可以一次性地重复使用相似的移动。

在此示例中,我们使用代数时间期限字段值的 7 个 int 参数构造一个 Joda-Time 日期时间。

我们将如何将其移植到 java.time 等效项?

这个 这个构造函数的 Joda-Time 中的 javadoc 说:

在默认时区根据日期时间字段值构造实例使用等时序学。

首先,我们可能会假设有 日期时间 类在 java.time 中,但没有。如果你用谷歌搜索 “从 joda 时间移植到 java 时间”,你很可能会找到 Stephen Colebourne 的博客文章 从 Joda-Time 转换为 java.time

这为你提供了一个良好的开端,也因为我们指明了我们使用 java.time.zonedDateTime 或 java.time.offsetDateTime 的方向。这是我们的第一个问题,我该用哪一个?根据斯蒂芬的评论,可能是 ZonedDateTime。

往上看 ZonedDateTime javadoc,我们根本看不到任何构造函数。回复 Stephen 的博客文章,我们进一步阅读了:

施工。Joda-Time 有一个构造函数,它接受对象并执行类型转换。java.time 只有工人厂方法,因为这是用户的问题,尽管为提供了 parse () 方法法。

因为这里,一定要有一个静态厂的方法法,搜索静态方法法,我们发现一个看起来很接近,但并不完全相信。

它有 7 个 int 参数,就像我们最初始的 Joda-Time DateTime 构造函数一样,但是如果你不注意,你会错过一个重要的细节。第 7 个参数不代表毫秒,而期望纳秒,这是因为 java.time 比 Joda-Time 提高 Joda-Time 提高了精度,并将瞬时测量量转换为纳秒。一个你很容易,我错过了重要的细节。此外,这个方法需要一个 zoneID,因为这样它会让你想知道为什么以前不需要一个,为什么现在需要它。

还记得我们原创构造函数数个 javadoc,其中提示到它将使用默认时区,也可能有办法获取 zoneID?

这个 适用于 ZoneID 的 javadoc 没有告诉我们列出任何构造函数,但是看看我们可以使用静态方法法 系统默认 ()

但我们已经整理好了 zoneID,那就等于毫秒到纳秒的转换,我们该怎么做?也许我们使用 java.util.concurrent.TimeUnit 来进行转换。

此方法返回长值,而我们的方法需要一个整数,所以现在我们还有一个转换问题需要解决。也许,我们可以尝试一些简单的东西。乘法?

这行得通,但看起来确实有点不合时宜。如果你还没有注意到,我们已经花费了大量的时间和精力来移植一行代码。但是,你可以想象,我们有许多这样的编辑需要手工完成,而且效果再好不过了。

但是,如果我们仔细研究一下java.time API,我们可以找到一个看起来更流畅的样子。

尽管 zonedDateTime 没有明显的方程来设置毫秒,但可以使用 使用(时间字段字段,长的 newValue)方法法,使用 ChronoField.milli_of_second 作为 TemporalField。

而且 java 的文文件提示到了,它会让我们执行秒转换:

当使用此字段设置值时,其行为方形应答与使用该值乘以 1,000,000 来设置 NANO_OF_SECOND 的方程式相异。

因为此,我们只需要在工厂方法中为纳秒指定 0,然后使用即可 创建具有所有原始值和毫秒的 zonedDateTime 的方法方法。

从我们的最终结果来看,我们可能只修改了一行代码,这并不是真的正在显示只显示一次性研究!

创建更快、更轻松地移民的秘密

Sensei 为我们提供了一种与其他开发人员共同享受这些来之不易的信息的方式。通过创建 Sanfoodsall all 这些的配对,它将允许 Sensei 用户单击鼠标来执行此项移动。

Sensei 食谱由 3 个主要部分组成:

  • 元数据
  • 可用的修复程序

让我们来看看 Sensei 的配对(也可以视为 YAML 配对),它会有所帮助,我们将在此调用移植到其等效的 java.time 中。

dateTime foo = 新的日期时间(年、中年的月份、月中的某天、一天中的某天、一天中的一小时、一分钟中的一小时、一分钟中的秒、毫秒的秒);

元数据部分

元数据部分包含有关配方及其使用方程式信息。

搜索部分

Sensei 配对的搜索部分指出了该配对方对哪些代码元素适用。

搜索:
实例:创建:
args:
1:
类型:整数
2:
类型:整数
3:
类型:整数
4:
类型:整数
5:
类型:整数
6:
类型:整数
7:
类型:整数
argCount:7
类型:org.joda.time.dateTime

在此搜索部分中,我们看到的是:

  • 正在搜索 实例:创建, 即构造函数的用法。注释:有 还有许多其他搜索目标可用
  • 构造函数应有 7 个参数,这是由指示的 argCount 属性
  • args 1-7 应该是整数类型
  • 我们正在寻找构造函数 类型 org.joda.time.DateTime

“可用的修复修复” 部分

可用修复部分可以指定一个或多个可应用以匹配代码元素的补丁。每个修复可以有多个操作制作,在我们的例子中,我们只有一个修复修复,它执行 2 个操作制作。

  • 这个 名称 将在 “快速修复” 菜单单中向用户显示,并说明如果用户应用此快速修复会发生什么
  • 显示此操作的操作列表快速修复将执行哪些操作正在运行
  • 这个 重写 操作将使用小胡子模版板重写代码元素。它可以使用变量和替换函数。
  • 这个 修理和修改配对的变量 action 将检查此构造函数是否有用,因为将值给定变量赋予了变量。如果是,则此操作将修改以声明为由指示的类别的变量 类型

使用配方进行代码转换

编程写作并启用我们的配方后,它会扫描我们的代码并突出显示可以应用的片段。

在下方的屏幕截图中,我们可以看到到目标的构造函数数已被老师标记。将鼠标悬停在标记的构造器上会显示食谱简短的重述和快速修复选项 移植到 java.time.zonedDateTime

Migrate New Date Time

在我们选择 移植到 java.time.zonedDateTime 快速修复,代码将根据我们在配方中指定的操作进行转换。

Zoned Date Time With Year Month Day Hour

使用 Sensei 进行一次性移植和跨团队统编程实践

我们可以从上面的示例中看出,一行代码的移植者可能参与及来之不易的事。Sensei 可以将这些知识转化为可操作的食谱或食谱,可以在团队内部共享分享。你可以计划一次性行为移植冲刺,也可以在遇到的时候采用 joda-timeDoda-timeDodecodeTimeTimeTojava.time 进行增量即时转换器的方法方法。您可以启用/禁用配方作为按摩逻辑 cilatimationpagen或步骤进行移植的一种方式,可以扩张或缩小Sensei Scan的文件目标,这种灵魂活性使代码移植不那种痛苦。

库库移植只是 Sensei 可以用于标准化目的地 dentacripanfirenformicanfirenformeChina 的一个例子。你可以随便注意在拉取中或自己编写 deadicodeTimeCrencregrencremincrencrencremine's 的反馈或者某种手动代码转换。如果你有一套 编程指南 开发人员经常错过这些指南,然后你可以指导方针转化为秘密方,让开发人员能够放心地应用批的代码转换。

您有任何疑问,我们很乐意听取您的意见!在 Slack 上加入我们,网址为: sensei-scw.slack.com

查看资源
查看资源

以方便的方型将 Joda-Time 移植到 java.time

对更多感兴趣?

Cameron is a Senior Software Developer at Secure Code Warrior. He has over 15 years of experience delivering software and is passionate about developer productivity and contributes actively to open-source software.

learn more

Secure Code Warrior可以帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全放在首位的文化。无论您是 AppSec 经理、开发人员、首席信息安全官还是任何与安全相关的人,我们都可以帮助您的组织降低与不安全代码相关的风险。

预订演示
分享到:
linkedin brandsSocialx logo
作者
Cameron Gregor
Published Nov 12, 2021

Cameron is a Senior Software Developer at Secure Code Warrior. He has over 15 years of experience delivering software and is passionate about developer productivity and contributes actively to open-source software.

分享到:
linkedin brandsSocialx logo

移民代码(阅读:旧版代码)并不能好玩。如果让它跨越界面极限,则需要花费大量的计划和精力。尽管对于开发者来说,这不是最令人惊讶的兴奋或最令人兴奋的作品,但将遗留代码移植到新的库版本确实需要决心和正确的经历。 Joda-Time 到 java.time 就是这样的移动,需要精心规划和执行。

如果你的Java项目是在 Java SE 8 之后的前端开始的,并且使用日期/时间处理,那它本可以使用 Joda-Time ——一个很不错的库,也是 PRESCISE 8 之后的日期和时间函数的事实上的事实。如果你是 静止不自动 使用 Joda-Time 但想移植到 java.time 然后继续阅读。

Java SE 8 的发布包括一个经过改进的全新标准日期和时间 API,通常称为 java.time (JSR-310)。Joda-Time 项目现在建议移植到 java.time (JSR-310)。

虽然 java.time (JSR-310) 在很大程度上受到 Joda-Time 的启用,但它不向后兼容,概述和术语也发生了变化。这就是为什么从 Joda-Time 移植到 java.time 需要注意你更新的每一行代码的原因。这可能很耗时,几乎可以让你望望有一种更简单、更自动化的移植方式。

有更好的 Sensei 移植方式,我们使用 Sensei 创建了它,Sensei 是一个 IntelliJ 插件,可根据你定义的配方(规则)自动执行代码转换。花时间定义可重复使用的配件,而非执行重复的移植任务。自动化不只能转换你的旧版 Joda-Time 代码,还可以帮忙助手团队在编写 newdaidcodeTime 时遵循 IDE 中的指导方针。

再有帮助你占先机,我们创建了一本公开的 Sensei 食谱 java.time 上面的标准化 (JSR-310) 其中包括 Joda-Time 从 Joda-Time 移植到 java.time 的食谱。这是一套越来越多的食谱,我们将继续扩大其覆盖范围,增加更多食谱。

以下是示例例子移植示例,可以帮您了解 Sensei 如何轻松 Sensei 移植遗留代码。

Video of how to set java.time zoned date time

从重复的手动动画移植到自动代码转换

让我们来看一个创建新 DateTime 的演示示例,该示例演示了我们将单行代码从 Joda-Time 移植到 java.time 时光中的一些隐身藏陷阱。然而之后,我们将查看 java.time Standarizated (JSR-310) 食谱中一位老师的秘密,并展示它是如何捕获所有这些信息的,比如任何开发人员都可以一次性地重复使用相似的移动。

在此示例中,我们使用代数时间期限字段值的 7 个 int 参数构造一个 Joda-Time 日期时间。

我们将如何将其移植到 java.time 等效项?

这个 这个构造函数的 Joda-Time 中的 javadoc 说:

在默认时区根据日期时间字段值构造实例使用等时序学。

首先,我们可能会假设有 日期时间 类在 java.time 中,但没有。如果你用谷歌搜索 “从 joda 时间移植到 java 时间”,你很可能会找到 Stephen Colebourne 的博客文章 从 Joda-Time 转换为 java.time

这为你提供了一个良好的开端,也因为我们指明了我们使用 java.time.zonedDateTime 或 java.time.offsetDateTime 的方向。这是我们的第一个问题,我该用哪一个?根据斯蒂芬的评论,可能是 ZonedDateTime。

往上看 ZonedDateTime javadoc,我们根本看不到任何构造函数。回复 Stephen 的博客文章,我们进一步阅读了:

施工。Joda-Time 有一个构造函数,它接受对象并执行类型转换。java.time 只有工人厂方法,因为这是用户的问题,尽管为提供了 parse () 方法法。

因为这里,一定要有一个静态厂的方法法,搜索静态方法法,我们发现一个看起来很接近,但并不完全相信。

它有 7 个 int 参数,就像我们最初始的 Joda-Time DateTime 构造函数一样,但是如果你不注意,你会错过一个重要的细节。第 7 个参数不代表毫秒,而期望纳秒,这是因为 java.time 比 Joda-Time 提高 Joda-Time 提高了精度,并将瞬时测量量转换为纳秒。一个你很容易,我错过了重要的细节。此外,这个方法需要一个 zoneID,因为这样它会让你想知道为什么以前不需要一个,为什么现在需要它。

还记得我们原创构造函数数个 javadoc,其中提示到它将使用默认时区,也可能有办法获取 zoneID?

这个 适用于 ZoneID 的 javadoc 没有告诉我们列出任何构造函数,但是看看我们可以使用静态方法法 系统默认 ()

但我们已经整理好了 zoneID,那就等于毫秒到纳秒的转换,我们该怎么做?也许我们使用 java.util.concurrent.TimeUnit 来进行转换。

此方法返回长值,而我们的方法需要一个整数,所以现在我们还有一个转换问题需要解决。也许,我们可以尝试一些简单的东西。乘法?

这行得通,但看起来确实有点不合时宜。如果你还没有注意到,我们已经花费了大量的时间和精力来移植一行代码。但是,你可以想象,我们有许多这样的编辑需要手工完成,而且效果再好不过了。

但是,如果我们仔细研究一下java.time API,我们可以找到一个看起来更流畅的样子。

尽管 zonedDateTime 没有明显的方程来设置毫秒,但可以使用 使用(时间字段字段,长的 newValue)方法法,使用 ChronoField.milli_of_second 作为 TemporalField。

而且 java 的文文件提示到了,它会让我们执行秒转换:

当使用此字段设置值时,其行为方形应答与使用该值乘以 1,000,000 来设置 NANO_OF_SECOND 的方程式相异。

因为此,我们只需要在工厂方法中为纳秒指定 0,然后使用即可 创建具有所有原始值和毫秒的 zonedDateTime 的方法方法。

从我们的最终结果来看,我们可能只修改了一行代码,这并不是真的正在显示只显示一次性研究!

创建更快、更轻松地移民的秘密

Sensei 为我们提供了一种与其他开发人员共同享受这些来之不易的信息的方式。通过创建 Sanfoodsall all 这些的配对,它将允许 Sensei 用户单击鼠标来执行此项移动。

Sensei 食谱由 3 个主要部分组成:

  • 元数据
  • 可用的修复程序

让我们来看看 Sensei 的配对(也可以视为 YAML 配对),它会有所帮助,我们将在此调用移植到其等效的 java.time 中。

dateTime foo = 新的日期时间(年、中年的月份、月中的某天、一天中的某天、一天中的一小时、一分钟中的一小时、一分钟中的秒、毫秒的秒);

元数据部分

元数据部分包含有关配方及其使用方程式信息。

搜索部分

Sensei 配对的搜索部分指出了该配对方对哪些代码元素适用。

搜索:
实例:创建:
args:
1:
类型:整数
2:
类型:整数
3:
类型:整数
4:
类型:整数
5:
类型:整数
6:
类型:整数
7:
类型:整数
argCount:7
类型:org.joda.time.dateTime

在此搜索部分中,我们看到的是:

  • 正在搜索 实例:创建, 即构造函数的用法。注释:有 还有许多其他搜索目标可用
  • 构造函数应有 7 个参数,这是由指示的 argCount 属性
  • args 1-7 应该是整数类型
  • 我们正在寻找构造函数 类型 org.joda.time.DateTime

“可用的修复修复” 部分

可用修复部分可以指定一个或多个可应用以匹配代码元素的补丁。每个修复可以有多个操作制作,在我们的例子中,我们只有一个修复修复,它执行 2 个操作制作。

  • 这个 名称 将在 “快速修复” 菜单单中向用户显示,并说明如果用户应用此快速修复会发生什么
  • 显示此操作的操作列表快速修复将执行哪些操作正在运行
  • 这个 重写 操作将使用小胡子模版板重写代码元素。它可以使用变量和替换函数。
  • 这个 修理和修改配对的变量 action 将检查此构造函数是否有用,因为将值给定变量赋予了变量。如果是,则此操作将修改以声明为由指示的类别的变量 类型

使用配方进行代码转换

编程写作并启用我们的配方后,它会扫描我们的代码并突出显示可以应用的片段。

在下方的屏幕截图中,我们可以看到到目标的构造函数数已被老师标记。将鼠标悬停在标记的构造器上会显示食谱简短的重述和快速修复选项 移植到 java.time.zonedDateTime

Migrate New Date Time

在我们选择 移植到 java.time.zonedDateTime 快速修复,代码将根据我们在配方中指定的操作进行转换。

Zoned Date Time With Year Month Day Hour

使用 Sensei 进行一次性移植和跨团队统编程实践

我们可以从上面的示例中看出,一行代码的移植者可能参与及来之不易的事。Sensei 可以将这些知识转化为可操作的食谱或食谱,可以在团队内部共享分享。你可以计划一次性行为移植冲刺,也可以在遇到的时候采用 joda-timeDoda-timeDodecodeTimeTimeTojava.time 进行增量即时转换器的方法方法。您可以启用/禁用配方作为按摩逻辑 cilatimationpagen或步骤进行移植的一种方式,可以扩张或缩小Sensei Scan的文件目标,这种灵魂活性使代码移植不那种痛苦。

库库移植只是 Sensei 可以用于标准化目的地 dentacripanfirenformicanfirenformeChina 的一个例子。你可以随便注意在拉取中或自己编写 deadicodeTimeCrencregrencremincrencrencremine's 的反馈或者某种手动代码转换。如果你有一套 编程指南 开发人员经常错过这些指南,然后你可以指导方针转化为秘密方,让开发人员能够放心地应用批的代码转换。

您有任何疑问,我们很乐意听取您的意见!在 Slack 上加入我们,网址为: sensei-scw.slack.com

查看资源
查看资源

填写下面的表格下载报告

我们希望获得您的许可,以便向您发送有关我们的产品和/或相关安全编码主题的信息。我们将始终非常谨慎地对待您的个人信息,绝不会出于营销目的将其出售给其他公司。

提交
scw success icon
scw error icon
要提交表单,请启用 “分析” Cookie。完成后,可以随意再次禁用它们。

移民代码(阅读:旧版代码)并不能好玩。如果让它跨越界面极限,则需要花费大量的计划和精力。尽管对于开发者来说,这不是最令人惊讶的兴奋或最令人兴奋的作品,但将遗留代码移植到新的库版本确实需要决心和正确的经历。 Joda-Time 到 java.time 就是这样的移动,需要精心规划和执行。

如果你的Java项目是在 Java SE 8 之后的前端开始的,并且使用日期/时间处理,那它本可以使用 Joda-Time ——一个很不错的库,也是 PRESCISE 8 之后的日期和时间函数的事实上的事实。如果你是 静止不自动 使用 Joda-Time 但想移植到 java.time 然后继续阅读。

Java SE 8 的发布包括一个经过改进的全新标准日期和时间 API,通常称为 java.time (JSR-310)。Joda-Time 项目现在建议移植到 java.time (JSR-310)。

虽然 java.time (JSR-310) 在很大程度上受到 Joda-Time 的启用,但它不向后兼容,概述和术语也发生了变化。这就是为什么从 Joda-Time 移植到 java.time 需要注意你更新的每一行代码的原因。这可能很耗时,几乎可以让你望望有一种更简单、更自动化的移植方式。

有更好的 Sensei 移植方式,我们使用 Sensei 创建了它,Sensei 是一个 IntelliJ 插件,可根据你定义的配方(规则)自动执行代码转换。花时间定义可重复使用的配件,而非执行重复的移植任务。自动化不只能转换你的旧版 Joda-Time 代码,还可以帮忙助手团队在编写 newdaidcodeTime 时遵循 IDE 中的指导方针。

再有帮助你占先机,我们创建了一本公开的 Sensei 食谱 java.time 上面的标准化 (JSR-310) 其中包括 Joda-Time 从 Joda-Time 移植到 java.time 的食谱。这是一套越来越多的食谱,我们将继续扩大其覆盖范围,增加更多食谱。

以下是示例例子移植示例,可以帮您了解 Sensei 如何轻松 Sensei 移植遗留代码。

Video of how to set java.time zoned date time

从重复的手动动画移植到自动代码转换

让我们来看一个创建新 DateTime 的演示示例,该示例演示了我们将单行代码从 Joda-Time 移植到 java.time 时光中的一些隐身藏陷阱。然而之后,我们将查看 java.time Standarizated (JSR-310) 食谱中一位老师的秘密,并展示它是如何捕获所有这些信息的,比如任何开发人员都可以一次性地重复使用相似的移动。

在此示例中,我们使用代数时间期限字段值的 7 个 int 参数构造一个 Joda-Time 日期时间。

我们将如何将其移植到 java.time 等效项?

这个 这个构造函数的 Joda-Time 中的 javadoc 说:

在默认时区根据日期时间字段值构造实例使用等时序学。

首先,我们可能会假设有 日期时间 类在 java.time 中,但没有。如果你用谷歌搜索 “从 joda 时间移植到 java 时间”,你很可能会找到 Stephen Colebourne 的博客文章 从 Joda-Time 转换为 java.time

这为你提供了一个良好的开端,也因为我们指明了我们使用 java.time.zonedDateTime 或 java.time.offsetDateTime 的方向。这是我们的第一个问题,我该用哪一个?根据斯蒂芬的评论,可能是 ZonedDateTime。

往上看 ZonedDateTime javadoc,我们根本看不到任何构造函数。回复 Stephen 的博客文章,我们进一步阅读了:

施工。Joda-Time 有一个构造函数,它接受对象并执行类型转换。java.time 只有工人厂方法,因为这是用户的问题,尽管为提供了 parse () 方法法。

因为这里,一定要有一个静态厂的方法法,搜索静态方法法,我们发现一个看起来很接近,但并不完全相信。

它有 7 个 int 参数,就像我们最初始的 Joda-Time DateTime 构造函数一样,但是如果你不注意,你会错过一个重要的细节。第 7 个参数不代表毫秒,而期望纳秒,这是因为 java.time 比 Joda-Time 提高 Joda-Time 提高了精度,并将瞬时测量量转换为纳秒。一个你很容易,我错过了重要的细节。此外,这个方法需要一个 zoneID,因为这样它会让你想知道为什么以前不需要一个,为什么现在需要它。

还记得我们原创构造函数数个 javadoc,其中提示到它将使用默认时区,也可能有办法获取 zoneID?

这个 适用于 ZoneID 的 javadoc 没有告诉我们列出任何构造函数,但是看看我们可以使用静态方法法 系统默认 ()

但我们已经整理好了 zoneID,那就等于毫秒到纳秒的转换,我们该怎么做?也许我们使用 java.util.concurrent.TimeUnit 来进行转换。

此方法返回长值,而我们的方法需要一个整数,所以现在我们还有一个转换问题需要解决。也许,我们可以尝试一些简单的东西。乘法?

这行得通,但看起来确实有点不合时宜。如果你还没有注意到,我们已经花费了大量的时间和精力来移植一行代码。但是,你可以想象,我们有许多这样的编辑需要手工完成,而且效果再好不过了。

但是,如果我们仔细研究一下java.time API,我们可以找到一个看起来更流畅的样子。

尽管 zonedDateTime 没有明显的方程来设置毫秒,但可以使用 使用(时间字段字段,长的 newValue)方法法,使用 ChronoField.milli_of_second 作为 TemporalField。

而且 java 的文文件提示到了,它会让我们执行秒转换:

当使用此字段设置值时,其行为方形应答与使用该值乘以 1,000,000 来设置 NANO_OF_SECOND 的方程式相异。

因为此,我们只需要在工厂方法中为纳秒指定 0,然后使用即可 创建具有所有原始值和毫秒的 zonedDateTime 的方法方法。

从我们的最终结果来看,我们可能只修改了一行代码,这并不是真的正在显示只显示一次性研究!

创建更快、更轻松地移民的秘密

Sensei 为我们提供了一种与其他开发人员共同享受这些来之不易的信息的方式。通过创建 Sanfoodsall all 这些的配对,它将允许 Sensei 用户单击鼠标来执行此项移动。

Sensei 食谱由 3 个主要部分组成:

  • 元数据
  • 可用的修复程序

让我们来看看 Sensei 的配对(也可以视为 YAML 配对),它会有所帮助,我们将在此调用移植到其等效的 java.time 中。

dateTime foo = 新的日期时间(年、中年的月份、月中的某天、一天中的某天、一天中的一小时、一分钟中的一小时、一分钟中的秒、毫秒的秒);

元数据部分

元数据部分包含有关配方及其使用方程式信息。

搜索部分

Sensei 配对的搜索部分指出了该配对方对哪些代码元素适用。

搜索:
实例:创建:
args:
1:
类型:整数
2:
类型:整数
3:
类型:整数
4:
类型:整数
5:
类型:整数
6:
类型:整数
7:
类型:整数
argCount:7
类型:org.joda.time.dateTime

在此搜索部分中,我们看到的是:

  • 正在搜索 实例:创建, 即构造函数的用法。注释:有 还有许多其他搜索目标可用
  • 构造函数应有 7 个参数,这是由指示的 argCount 属性
  • args 1-7 应该是整数类型
  • 我们正在寻找构造函数 类型 org.joda.time.DateTime

“可用的修复修复” 部分

可用修复部分可以指定一个或多个可应用以匹配代码元素的补丁。每个修复可以有多个操作制作,在我们的例子中,我们只有一个修复修复,它执行 2 个操作制作。

  • 这个 名称 将在 “快速修复” 菜单单中向用户显示,并说明如果用户应用此快速修复会发生什么
  • 显示此操作的操作列表快速修复将执行哪些操作正在运行
  • 这个 重写 操作将使用小胡子模版板重写代码元素。它可以使用变量和替换函数。
  • 这个 修理和修改配对的变量 action 将检查此构造函数是否有用,因为将值给定变量赋予了变量。如果是,则此操作将修改以声明为由指示的类别的变量 类型

使用配方进行代码转换

编程写作并启用我们的配方后,它会扫描我们的代码并突出显示可以应用的片段。

在下方的屏幕截图中,我们可以看到到目标的构造函数数已被老师标记。将鼠标悬停在标记的构造器上会显示食谱简短的重述和快速修复选项 移植到 java.time.zonedDateTime

Migrate New Date Time

在我们选择 移植到 java.time.zonedDateTime 快速修复,代码将根据我们在配方中指定的操作进行转换。

Zoned Date Time With Year Month Day Hour

使用 Sensei 进行一次性移植和跨团队统编程实践

我们可以从上面的示例中看出,一行代码的移植者可能参与及来之不易的事。Sensei 可以将这些知识转化为可操作的食谱或食谱,可以在团队内部共享分享。你可以计划一次性行为移植冲刺,也可以在遇到的时候采用 joda-timeDoda-timeDodecodeTimeTimeTojava.time 进行增量即时转换器的方法方法。您可以启用/禁用配方作为按摩逻辑 cilatimationpagen或步骤进行移植的一种方式,可以扩张或缩小Sensei Scan的文件目标,这种灵魂活性使代码移植不那种痛苦。

库库移植只是 Sensei 可以用于标准化目的地 dentacripanfirenformicanfirenformeChina 的一个例子。你可以随便注意在拉取中或自己编写 deadicodeTimeCrencregrencremincrencrencremine's 的反馈或者某种手动代码转换。如果你有一套 编程指南 开发人员经常错过这些指南,然后你可以指导方针转化为秘密方,让开发人员能够放心地应用批的代码转换。

您有任何疑问,我们很乐意听取您的意见!在 Slack 上加入我们,网址为: sensei-scw.slack.com

观看网络研讨会
开始吧
learn more

点击下面的链接并下载此资源的PDF。

Secure Code Warrior可以帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全放在首位的文化。无论您是 AppSec 经理、开发人员、首席信息安全官还是任何与安全相关的人,我们都可以帮助您的组织降低与不安全代码相关的风险。

查看报告预订演示
查看资源
分享到:
linkedin brandsSocialx logo
对更多感兴趣?

分享到:
linkedin brandsSocialx logo
作者
Cameron Gregor
Published Nov 12, 2021

Cameron is a Senior Software Developer at Secure Code Warrior. He has over 15 years of experience delivering software and is passionate about developer productivity and contributes actively to open-source software.

分享到:
linkedin brandsSocialx logo

移民代码(阅读:旧版代码)并不能好玩。如果让它跨越界面极限,则需要花费大量的计划和精力。尽管对于开发者来说,这不是最令人惊讶的兴奋或最令人兴奋的作品,但将遗留代码移植到新的库版本确实需要决心和正确的经历。 Joda-Time 到 java.time 就是这样的移动,需要精心规划和执行。

如果你的Java项目是在 Java SE 8 之后的前端开始的,并且使用日期/时间处理,那它本可以使用 Joda-Time ——一个很不错的库,也是 PRESCISE 8 之后的日期和时间函数的事实上的事实。如果你是 静止不自动 使用 Joda-Time 但想移植到 java.time 然后继续阅读。

Java SE 8 的发布包括一个经过改进的全新标准日期和时间 API,通常称为 java.time (JSR-310)。Joda-Time 项目现在建议移植到 java.time (JSR-310)。

虽然 java.time (JSR-310) 在很大程度上受到 Joda-Time 的启用,但它不向后兼容,概述和术语也发生了变化。这就是为什么从 Joda-Time 移植到 java.time 需要注意你更新的每一行代码的原因。这可能很耗时,几乎可以让你望望有一种更简单、更自动化的移植方式。

有更好的 Sensei 移植方式,我们使用 Sensei 创建了它,Sensei 是一个 IntelliJ 插件,可根据你定义的配方(规则)自动执行代码转换。花时间定义可重复使用的配件,而非执行重复的移植任务。自动化不只能转换你的旧版 Joda-Time 代码,还可以帮忙助手团队在编写 newdaidcodeTime 时遵循 IDE 中的指导方针。

再有帮助你占先机,我们创建了一本公开的 Sensei 食谱 java.time 上面的标准化 (JSR-310) 其中包括 Joda-Time 从 Joda-Time 移植到 java.time 的食谱。这是一套越来越多的食谱,我们将继续扩大其覆盖范围,增加更多食谱。

以下是示例例子移植示例,可以帮您了解 Sensei 如何轻松 Sensei 移植遗留代码。

Video of how to set java.time zoned date time

从重复的手动动画移植到自动代码转换

让我们来看一个创建新 DateTime 的演示示例,该示例演示了我们将单行代码从 Joda-Time 移植到 java.time 时光中的一些隐身藏陷阱。然而之后,我们将查看 java.time Standarizated (JSR-310) 食谱中一位老师的秘密,并展示它是如何捕获所有这些信息的,比如任何开发人员都可以一次性地重复使用相似的移动。

在此示例中,我们使用代数时间期限字段值的 7 个 int 参数构造一个 Joda-Time 日期时间。

我们将如何将其移植到 java.time 等效项?

这个 这个构造函数的 Joda-Time 中的 javadoc 说:

在默认时区根据日期时间字段值构造实例使用等时序学。

首先,我们可能会假设有 日期时间 类在 java.time 中,但没有。如果你用谷歌搜索 “从 joda 时间移植到 java 时间”,你很可能会找到 Stephen Colebourne 的博客文章 从 Joda-Time 转换为 java.time

这为你提供了一个良好的开端,也因为我们指明了我们使用 java.time.zonedDateTime 或 java.time.offsetDateTime 的方向。这是我们的第一个问题,我该用哪一个?根据斯蒂芬的评论,可能是 ZonedDateTime。

往上看 ZonedDateTime javadoc,我们根本看不到任何构造函数。回复 Stephen 的博客文章,我们进一步阅读了:

施工。Joda-Time 有一个构造函数,它接受对象并执行类型转换。java.time 只有工人厂方法,因为这是用户的问题,尽管为提供了 parse () 方法法。

因为这里,一定要有一个静态厂的方法法,搜索静态方法法,我们发现一个看起来很接近,但并不完全相信。

它有 7 个 int 参数,就像我们最初始的 Joda-Time DateTime 构造函数一样,但是如果你不注意,你会错过一个重要的细节。第 7 个参数不代表毫秒,而期望纳秒,这是因为 java.time 比 Joda-Time 提高 Joda-Time 提高了精度,并将瞬时测量量转换为纳秒。一个你很容易,我错过了重要的细节。此外,这个方法需要一个 zoneID,因为这样它会让你想知道为什么以前不需要一个,为什么现在需要它。

还记得我们原创构造函数数个 javadoc,其中提示到它将使用默认时区,也可能有办法获取 zoneID?

这个 适用于 ZoneID 的 javadoc 没有告诉我们列出任何构造函数,但是看看我们可以使用静态方法法 系统默认 ()

但我们已经整理好了 zoneID,那就等于毫秒到纳秒的转换,我们该怎么做?也许我们使用 java.util.concurrent.TimeUnit 来进行转换。

此方法返回长值,而我们的方法需要一个整数,所以现在我们还有一个转换问题需要解决。也许,我们可以尝试一些简单的东西。乘法?

这行得通,但看起来确实有点不合时宜。如果你还没有注意到,我们已经花费了大量的时间和精力来移植一行代码。但是,你可以想象,我们有许多这样的编辑需要手工完成,而且效果再好不过了。

但是,如果我们仔细研究一下java.time API,我们可以找到一个看起来更流畅的样子。

尽管 zonedDateTime 没有明显的方程来设置毫秒,但可以使用 使用(时间字段字段,长的 newValue)方法法,使用 ChronoField.milli_of_second 作为 TemporalField。

而且 java 的文文件提示到了,它会让我们执行秒转换:

当使用此字段设置值时,其行为方形应答与使用该值乘以 1,000,000 来设置 NANO_OF_SECOND 的方程式相异。

因为此,我们只需要在工厂方法中为纳秒指定 0,然后使用即可 创建具有所有原始值和毫秒的 zonedDateTime 的方法方法。

从我们的最终结果来看,我们可能只修改了一行代码,这并不是真的正在显示只显示一次性研究!

创建更快、更轻松地移民的秘密

Sensei 为我们提供了一种与其他开发人员共同享受这些来之不易的信息的方式。通过创建 Sanfoodsall all 这些的配对,它将允许 Sensei 用户单击鼠标来执行此项移动。

Sensei 食谱由 3 个主要部分组成:

  • 元数据
  • 可用的修复程序

让我们来看看 Sensei 的配对(也可以视为 YAML 配对),它会有所帮助,我们将在此调用移植到其等效的 java.time 中。

dateTime foo = 新的日期时间(年、中年的月份、月中的某天、一天中的某天、一天中的一小时、一分钟中的一小时、一分钟中的秒、毫秒的秒);

元数据部分

元数据部分包含有关配方及其使用方程式信息。

搜索部分

Sensei 配对的搜索部分指出了该配对方对哪些代码元素适用。

搜索:
实例:创建:
args:
1:
类型:整数
2:
类型:整数
3:
类型:整数
4:
类型:整数
5:
类型:整数
6:
类型:整数
7:
类型:整数
argCount:7
类型:org.joda.time.dateTime

在此搜索部分中,我们看到的是:

  • 正在搜索 实例:创建, 即构造函数的用法。注释:有 还有许多其他搜索目标可用
  • 构造函数应有 7 个参数,这是由指示的 argCount 属性
  • args 1-7 应该是整数类型
  • 我们正在寻找构造函数 类型 org.joda.time.DateTime

“可用的修复修复” 部分

可用修复部分可以指定一个或多个可应用以匹配代码元素的补丁。每个修复可以有多个操作制作,在我们的例子中,我们只有一个修复修复,它执行 2 个操作制作。

  • 这个 名称 将在 “快速修复” 菜单单中向用户显示,并说明如果用户应用此快速修复会发生什么
  • 显示此操作的操作列表快速修复将执行哪些操作正在运行
  • 这个 重写 操作将使用小胡子模版板重写代码元素。它可以使用变量和替换函数。
  • 这个 修理和修改配对的变量 action 将检查此构造函数是否有用,因为将值给定变量赋予了变量。如果是,则此操作将修改以声明为由指示的类别的变量 类型

使用配方进行代码转换

编程写作并启用我们的配方后,它会扫描我们的代码并突出显示可以应用的片段。

在下方的屏幕截图中,我们可以看到到目标的构造函数数已被老师标记。将鼠标悬停在标记的构造器上会显示食谱简短的重述和快速修复选项 移植到 java.time.zonedDateTime

Migrate New Date Time

在我们选择 移植到 java.time.zonedDateTime 快速修复,代码将根据我们在配方中指定的操作进行转换。

Zoned Date Time With Year Month Day Hour

使用 Sensei 进行一次性移植和跨团队统编程实践

我们可以从上面的示例中看出,一行代码的移植者可能参与及来之不易的事。Sensei 可以将这些知识转化为可操作的食谱或食谱,可以在团队内部共享分享。你可以计划一次性行为移植冲刺,也可以在遇到的时候采用 joda-timeDoda-timeDodecodeTimeTimeTojava.time 进行增量即时转换器的方法方法。您可以启用/禁用配方作为按摩逻辑 cilatimationpagen或步骤进行移植的一种方式,可以扩张或缩小Sensei Scan的文件目标,这种灵魂活性使代码移植不那种痛苦。

库库移植只是 Sensei 可以用于标准化目的地 dentacripanfirenformicanfirenformeChina 的一个例子。你可以随便注意在拉取中或自己编写 deadicodeTimeCrencregrencremincrencrencremine's 的反馈或者某种手动代码转换。如果你有一套 编程指南 开发人员经常错过这些指南,然后你可以指导方针转化为秘密方,让开发人员能够放心地应用批的代码转换。

您有任何疑问,我们很乐意听取您的意见!在 Slack 上加入我们,网址为: sensei-scw.slack.com

目录

下载PDF
查看资源
对更多感兴趣?

Cameron is a Senior Software Developer at Secure Code Warrior. He has over 15 years of experience delivering software and is passionate about developer productivity and contributes actively to open-source software.

learn more

Secure Code Warrior可以帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全放在首位的文化。无论您是 AppSec 经理、开发人员、首席信息安全官还是任何与安全相关的人,我们都可以帮助您的组织降低与不安全代码相关的风险。

预订演示下载
分享到:
linkedin brandsSocialx logo
资源中心

帮助您入门的资源

更多帖子
资源中心

帮助您入门的资源

更多帖子