标签: java-time

使用 java.time 查找一年最后一周的第一天

我需要使用 Java 8 日期和时间 API ( java.time )找到一年最后一周的第一天,最后得出了这个解决方案:

LocalDate date = LocalDate.of(2016, 2, 17);
LocalDate lastWeekOfYear = LocalDate.of(date.getYear() + 1, 1, 7)
    .with(WeekFields.ISO.weekOfYear(), 1)
    .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).minusDays(7);
Run Code Online (Sandbox Code Playgroud)

此解决方案查找下一年的第一周,必要时将星期几调整为星期一,然后将 7 天后移。有没有更聪明的方法来达到同样的结果?

java date java-time

5
推荐指数
1
解决办法
2083
查看次数

如何使用 LocalDate 查询 LocalDateTime?

我有一个包含 java.time.LocalDateTime 类型的属性的类。

public class MyClass{
    // ...
    private LocalDateTime fecha;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Spring Data 存储库。我想要完成的是根据日期查询实体:

@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {
    // ...
    public void deleteByFecha(LocalDate fecha);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为抛出异常:

org.springframework.dao.InvalidDataAccessApiUsageException: 参数值 [2016-10-05] 与预期类型 [java.time.LocalDateTime (n/a)] 不匹配;

所以问题是如何通过fecha但使用 LocalDate查询数据库中的 MyClass ?

编辑 以防万一有人面临同样的问题,我想出了一个解决方案:修改存储库的方法,使其看起来如下:

import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
// ...

@Service
public interface IRepository extends CrudRepository<MyClass, UUID> {

    @Transactional
    @Modifying
    @Query("DELETE FROM MyClass mtc WHERE YEAR(mtc.fecha)=?1 AND MONTH(mtc.fecha)=?2 AND DAY(mtc.fecha)=?3")
    public …
Run Code Online (Sandbox Code Playgroud)

java spring spring-data java-time spring-repositories

5
推荐指数
1
解决办法
1万
查看次数

以秒为单位获取当前时间

有没有办法以秒为单位获取当天的当前时间?请注意,我问的是一天中的时间,而不是 UTC 时间。

我想要的是介于0 - 86,400 (12:00AM - 11:59PM)之间的值(以秒为单位)。我正在开发一个每天运行的应用程序,当一天结束时,时间(以秒为单位)应该重新开始0。

所以让我们说它是10:00AM。我应该得到36,000秒,如果我的时间是5:00PM,我应该得到61,200秒。

PS:我不知道手头的时间。该程序将使用currentTime()函数自行计算。

java java-time

5
推荐指数
1
解决办法
6206
查看次数

如何使用 EasyMock、没有 Joda Time 和 PowerMock 在 Java 8 Web 应用程序中将当前系统时间覆盖为特定日期?

我需要在 Java 8 中模拟时间(到特定日期,这意味着我可能不会使用anyLong())以java.time在 EasyMock 下的测试环境中单独使用,因此没有 Joda Time。

EasyMock 不允许你模拟像LocalDateTime.now(). PowerMock 可以,但我不允许使用 PowerMock。

Joda Time 库提供了一种简洁优雅的方式来模拟时间DateTimeUtils.setCurrentMillisFixed(),并DateTimeUtils.setCurrentMillisSystem()回到现在的瞬间。

只有我不允许使用 Joda Time。

我被告知使用模拟时钟java.time.Clock类实例并将其注入LocalDateTime.now()如下:LocalDateTime.now(mockClock)

有没有办法在没有 Joda Time和 PowerMock 的情况下正确实现它?

junit easymock junit4 java-8 java-time

5
推荐指数
1
解决办法
2541
查看次数

在 MySql TIME 列中保存 LocalTime

背景故事

我最近遇到了LocalTime将 a保存到TIMEMySQL 数据库中的列的问题。保存 的值9:00会导致8:00保存在数据库中。

这个问题在我的开发环境(Windows)上没有发生,但在我们试过的两台 Linux 机器上确实发生了。

我的代码如下:

preparedStatement.setObject(parameterIndex, localTime, JDBCType.TIME);
Run Code Online (Sandbox Code Playgroud)

经过调查,我最终发现 MySQL JDBC 驱动程序正在使用java.sql.Time.valueOf(localTime),然后使用 将SimpleDateFormat其时区设置为 MySql 服务器的system_time_zone系统属性(via time_zone = 'SYSTEM'),将其打印为字符串。

在 Linux 机器上,system_time_zone是GMT,而在 Windows 机器上,它是GMT Standard Time. (我在英国。)

因此, theLocalTime 9:00被转换为 a Timeof 9:00 Europe/London(实际上在内部建模为1st January 1970 9:00 Europe/London),然后使用GMT时区将其写出,该时区与UTC. 现在,通常这两个时区在 1 月份与 UTC 的偏移量为零,但英国在 1969 年和 1970 …

java mysql localtime java-time

5
推荐指数
0
解决办法
980
查看次数

为什么 java.time 对日期使用“of”而不是“new”?

在新的日期包的Java 8中,我们使用“更改新日期()”到“LOCALDATE的。的()”。

Date d = new Date(year, month, dayOfMonth);            //Old way
LocalDate d2 = LocalDate.of(year, month, dayOfMonth);  //new way
Run Code Online (Sandbox Code Playgroud)

当您想要一个新对象时,您通常使用new关键字。这是创建新对象的直观方式。

有时,当您需要延迟初始化的单例时,您可以使用静态方法来获取实例。在这种情况下,您必须调用它,getInstance()以便开发人员知道会发生什么。

这种新语法使代码不那么直观。它迫使您学习如何处理特定对象,而不是简单地使用它们。

这种变化有什么好的理由吗?

java date java-8 java-time

5
推荐指数
1
解决办法
274
查看次数

哪个 `Clock` 实现是 java.time 中的默认实现?

Java 8 及更高版本中内置的java.time框架包含Clock该类。这个类提供了一些对测试我们的日期时间处理代码有用的变体。

Instant.now( Clock.fixed?( myInstant , myZoneId ) )
Run Code Online (Sandbox Code Playgroud)

哪个Clock实例表示在java.time调用中隐式使用的默认值,其中我们没有指定Clock?

Instant.now()
Run Code Online (Sandbox Code Playgroud)

我想默认是:

……但文档没有说明是哪个。

在进行单元测试时,有时我们需要一个行为改变的时钟。但是当我们想显式传递一个Clock提供默认行为的对象时,我们使用什么?

java clock java-time

5
推荐指数
1
解决办法
439
查看次数

将约会存储在 SQL 数据库(例如 Postgres)中以与 java.time 框架一起使用

假设我们在 01/23/2021 21:00 "Europe/Rome"有一个在意大利米兰的约会。此约会以 UTC 格式保存到数据库中类似于 SQL 标准类型的列中TIMESTAMP WITH TIME ZONE。

现在,居住在美国纽约的用户需要了解此约会何时进行。我们可以向用户显示转换为“America/New_York”时区的日期时间,或者改为“Europe/Rome”TZ。一旦用户从纽约飞往米兰,他就会发现这两个信息都很有用。

关键是存储转换为相同 TZ 引用 (UTC) 的所有内容,并根据您使用与现代 Java 捆绑的java.time框架的目标来操作日期时间。

有道理还是有什么问题/遗漏?

java database postgresql timezone java-time

5
推荐指数
1
解决办法
221
查看次数

Duration#toDays 和 Duration#toDaysPart 是多余的吗?

在 Java 8 中,Duration该类提供了该toDays方法,将总天数作为与日历天无关的 24 小时时间块的计数返回。

在 Java 9 中,Duration该类获得了方便的to…Part方法:toDaysPart, toHoursPart, toMinutesPart, toSecondsPart, toMillisPart, toNanosPart。我了解小时、分钟等的需要。但我想知道toDaysPart.

我的问题是:

? 是否会Duration#toDays并且Duration#toDaysPart曾经为特定Duration对象返回不同的值?

java duration java-8 java-time java-9

5
推荐指数
1
解决办法
184
查看次数

java.text.ParseException:无法解析的日期:“...”

我使用此代码收到此错误:

SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd MMMM HH:mm yyyy",myDateFormatSymbols);
sdf.parse("????????? 12 ??????? 07:00 2021");
Run Code Online (Sandbox Code Playgroud)

是 "Monday 12 April 07:00 2021"。问题是,每当我将日期从星期一更改为星期二 ( "????????") 时,我都不会收到此错误,并且代码有效。这是代码myDateFormatSymbols:

private final static DateFormatSymbols myDateFormatSymbols = new DateFormatSymbols(){
        @Override
        public String[] getWeekdays(){
             return new String[]{"?????????","????????", "??????", "??????", "???????", "??????", "??????"};
        }
        @Override
        public String[] getMonths() {
            return new String[]{...};
        }
}
Run Code Online (Sandbox Code Playgroud)

所有月份和工作日都正常工作,似乎这个错误只发生在星期一。

java dayofweek simpledateformat datetime-parsing java-time

5
推荐指数
2
解决办法
495
查看次数