我需要使用 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.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) 有没有办法以秒为单位获取当天的当前时间?请注意,我问的是一天中的时间,而不是 UTC 时间。
我想要的是介于0 - 86,400 (12:00AM - 11:59PM)之间的值(以秒为单位)。我正在开发一个每天运行的应用程序,当一天结束时,时间(以秒为单位)应该重新开始0。
所以让我们说它是10:00AM。我应该得到36,000秒,如果我的时间是5:00PM,我应该得到61,200秒。
PS:我不知道手头的时间。该程序将使用currentTime()函数自行计算。
我需要在 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 的情况下正确实现它?
我最近遇到了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 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 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提供默认行为的对象时,我们使用什么?
假设我们在 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 8 中,Duration该类提供了该toDays方法,将总天数作为与日历天无关的 24 小时时间块的计数返回。
在 Java 9 中,Duration该类获得了方便的to…Part方法:toDaysPart, toHoursPart, toMinutesPart, toSecondsPart, toMillisPart, toNanosPart。我了解小时、分钟等的需要。但我想知道toDaysPart.
我的问题是:
? 是否会Duration#toDays并且Duration#toDaysPart曾经为特定Duration对象返回不同的值?
我使用此代码收到此错误:
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)
所有月份和工作日都正常工作,似乎这个错误只发生在星期一。