在我的应用程序中,我想根据年龄范围过滤数据。问题是我没有将年龄存储在数据库中,所以我必须使用生日。
这是我到目前为止所做的,但这是不正确的:
public String getDOBFromAge(int age){
LocalDate today = LocalDate.now();
LocalDate ld = today.minusYears(age);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return ld.format(dtf);
}
Run Code Online (Sandbox Code Playgroud)
当我的年龄 = 23 时,它给出的输出为 1999-12-20。截至 2022 年 12 月 20 日,我已 23 岁,但我的生日是 1999 年 11 月 24 日。所以我的解决方案缺少一些东西。谁能帮帮我吗?
我正在开发一个项目,其中我的zoneid有限,并且我从前端获取zoneoff设置,所以这就是为什么我想将时间关闭设置转换为java中的zoneid。有没有办法将 zoneoffset 转换为区域 id。
我正在创建一个后端服务,该服务应该向第三方服务发出一些请求并根据响应进行更新。单一的工作是由数千个微小的工作组成的。主要工作以及每个子工作的确切begin时间应存储在报告中。主要作业也可以从网络用户界面运行,这意味着其他时区取决于登录的用户。endbeginend
最初的想法(和实现)是在主作业的一开始就存储ZoneId(如果作业按计划启动,则存储在本地服务器中;如果用户手动启动作业,则存储在登录用户中),然后用于LocalDateTime存储begin和end主要工作和子工作。或者在这种情况下我应该使用Instant而不是LocalDateTime?
private ZoneId zoneId;
private LocalDateTime begin;
private LocalDateTime end;
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是正确的使用方式,或者我应该为每个ZoneId使用它,并忘记独立的属性。ZonedDateTimebeginendZoneId
private ZonedDateTime begin;
private ZonedDateTime end;
Run Code Online (Sandbox Code Playgroud)
编辑:只是为了为未来的读者提供更多信息:
情况 1将是 cron 作业,它将每天在某个时间运行一次(具体时间并不重要,但每天的同一时间)并且报告将显示“开始作业于”、“完成作业于”。
情况 2是当单击“立即运行更新”时,相同的作业将运行并生成相同的报告。
我刚刚发现 具有Instant#ofEpochSecond(epochSecond)最小值/最大值。
这里是源代码。
// Instant.java
/**
* The minimum supported epoch second.
*/
private static final long MIN_SECOND = -31557014167219200L;
/**
* The maximum supported epoch second.
*/
private static final long MAX_SECOND = 31556889864403199L; // << I WANT THIS VALUE!
Run Code Online (Sandbox Code Playgroud)
我如何以MAX_SECOND编程方式获取?
我试图弄清楚Range,
final var range = ChronoField.INSTANT_SECONDS.range();
log.debug(" minimum: {}", range.getMinimum());
log.debug(" largestMinimum: {}", range.getLargestMinimum());
log.debug(" maximum: {}", range.getMaximum());
log.debug("smallestMaximum: {}", range.getSmallestMaximum());
Run Code Online (Sandbox Code Playgroud)
并且没有运气。
03:53:36.120 [ main] DEBUG - minimum: -9223372036854775808
03:53:36.122 [ main] …Run Code Online (Sandbox Code Playgroud) 我正在使用转换Grails Joda-Time插件到JavaTime.
我有这样的旧Joda时间码:
def style
switch (type) {
case LocalTime:
style = '-S'
break
case LocalDate:
style = 'S-'
break
default:
style = 'SS'
}
Locale locale = LocaleContextHolder.locale
return DateTimeFormatter.ofPattern(style, locale).withResolverStyle(ResolverStyle.LENIENT)
Run Code Online (Sandbox Code Playgroud)
我怎样才能将它转换为JSR 310?我找不到任何类似于接受样式的方法forStyle(String style).
UPD 我找到了解决方法:
Locale locale = LocaleContextHolder.locale
DateTimeFormatter formatter
switch (type) {
case LocalTime:
formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(locale)
break
case LocalDate:
formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(locale)
break
default:
formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(locale)
}
return formatter
Run Code Online (Sandbox Code Playgroud)
但它失败的Instant类型.Spock规范重现:
def 'Instant locale formatting'() {
given:
Instant inst …Run Code Online (Sandbox Code Playgroud) 任何人都可以向我解释为什么这个测试通过:
import org.junit.Assert;
import org.junit.Test;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import static org.hamcrest.core.Is.is;
public class BasicTest extends Assert{
@Test
public void testLocalTimeWithPredefinedPattern() throws Exception {
DateTimeFormatter dtf = DateTimeFormatter.ISO_TIME;
LocalTime time = LocalTime.parse("10:11:12", dtf);
assertThat(time.toString(), is("10:11:12"));
}
/**
* It's a kind of bug from my side of view
*/
@Test(expected = DateTimeParseException.class)
public void testLocalTimeWithCustomPattern() throws Exception {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalTime time = LocalTime.parse("10:11:12", dtf);
}
}
Run Code Online (Sandbox Code Playgroud)
第二次测试捕获的异常如下所示:
java.time.format.DateTimeParseException: Text '10:11:12' could not be parsed: Unable …Run Code Online (Sandbox Code Playgroud) 我想得到今天和今天一年后的日期.例如,如果今天是2015-9-18,明年是2016-9-18.
我想用Java LocalDate.
根据这个答案,没有一个Duration.ofMonths()
因为一个月的长度不一样.
但为什么不存在Duration.ofWeeks()呢?一周的长度不变,至少不超过一天的长度.我们确实有一个Duration.ofDays().
那么,这有充分的理由吗?
我的需要是我有一个Long值,它代表自epoch以来的毫秒值.我希望了解当天和当天之间的天数差异.我正在使用Java8DAYS.between(inputDate, currentDate)
对于我使用的currentDate LocalDateTime currentDate = LocalDateTime.now();
但是我面临的问题是当我将long值转换为java8 LocalDateTime时.我用的时候
LocalDate date = Instant.ofEpochMilli(1490372528)
.atZone(ZoneId.systemDefault())
.toLocalDate();
Run Code Online (Sandbox Code Playgroud)
结果是1970-01-18当我在https://www.epochconverter.com/中输入相同的值时,它给出了Fri, 24 Mar 2017 16:22:08 GMT
为什么会出现这种差异?如何从长值中有效地获取java8日期以在DAYS.between()中使用?
我有一个Java方法如下:
private static boolean isDateBetweenRange(DataSet obj, MyClass dataSource, ConditionContext context) {
FilterContext fc = dataSource.getData();
LocalDate dateFieldToCheck = obj.getDate(fc.getDateField()).toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate minDate = fc.getMinDateValue();
LocalDate maxDate = fc.getMaxDateValue();
if (minDate == null || maxDate == null) {
minDate = context.getStartDate().toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
maxDate = context.getEndDate().toInstant().atZone(ZoneId.systemDefault())
.toLocalDate();
}
boolean result = (dateFieldToCheck.isAfter(minDate) || dateFieldToCheck.isEqual(minDate))
&& (dateFieldToCheck.isBefore(maxDate) || dateFieldToCheck.isEqual(maxDate));
return result;
}
Run Code Online (Sandbox Code Playgroud)
我也想做同样的逻辑LocalDateTime.LocalDateTime如果我重载方法,它将是完全相同的代码.
如何使该方法通用,LocalDate并LocalDateTime使用泛型或任何其他机制?
我如何根据我的类型制作context.getXXXDate()... toLocalDate()或toLocalDateTime()使用通用代码?