标签: java-time

根据给定的年龄找出人们的最小出生日期?

在我的应用程序中,我想根据年龄范围过滤数据。问题是我没有将年龄存储在数据库中,所以我必须使用生日。

这是我到目前为止所做的,但这是不正确的:

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 日。所以我的解决方案缺少一些东西。谁能帮帮我吗?

java java-time localdate

2
推荐指数
1
解决办法
118
查看次数

有没有办法在Java 8中将ZoneOffset转换为ZoneId?

我正在开发一个项目,其中我的zoneid有限,并且我从前端获取zoneoff设置,所以这就是为什么我想将时间关闭设置转换为java中的zoneid。有没有办法将 zoneoffset 转换为区域 id。

java java-time zoneid

2
推荐指数
1
解决办法
162
查看次数

Java LocalDateTime 与 ZonedDateTime

我正在创建一个后端服务,该服务应该向第三方服务发出一些请求并根据响应进行更新。单一的工作是由数千个微小的工作组成的。主要工作以及每个子工作的确切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是当单击“立即运行更新”时,相同的作业将运行并生成相同的报告。

java java-time

2
推荐指数
1
解决办法
139
查看次数

如何获得 Instant#ofEpochSecond(?) 的最大值

我刚刚发现 具有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)

java epoch instant java-time

2
推荐指数
1
解决办法
78
查看次数

如何将Joda-Time的DateTimeFormat.forStyle()转换为JSR 310 JavaTime?

我正在使用转换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)

migration jodatime java-8 java-time

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

带自定义模式的JDK8 java.time.LocalTime

任何人都可以向我解释为什么这个测试通过:

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)

java java-8 java-time

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

获得明年的约会

我想得到今天和今天一年后的日期.例如,如果今天是2015-9-18,明年是2016-9-18.

我想用Java LocalDate.

java java-8 java-time

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

为什么没有Duration.ofWeeks()?

根据这个答案,没有一个Duration.ofMonths()

因为一个月的长度不一样.

但为什么不存在Duration.ofWeeks()呢?一周的长度不变,至少不超过一天的长度.我们确实有一个Duration.ofDays().

那么,这有充分的理由吗?

java datetime java-8 java-time

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

找出两个长纪元值表示的两个日期之间的差异

我的需要是我有一个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 epoch java-8 java-time localdate

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

如何使方法通用以使用LocalDate和LocalDateTime?

我有一个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()使用通用代码?

polymorphism java-8 jsr310 java-time

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