标签: java-time

Duration. Between 与 ChronoUnit. Between

这两种方法等效吗?

版本1:

var diff = Duration.between(begin, end).toHours();
Run Code Online (Sandbox Code Playgroud)

版本 2;

var diff = ChronoUnit.HOURS.between(begin, end);
Run Code Online (Sandbox Code Playgroud)

是否存在任何隐含的差异?如果是,我应该选择哪一个?

java java-time

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

MaterialDatePicker 选择后返回不正确的日期

由于某些未知原因,MaterialDatePicker 在选择后返回不正确的日期。例如,用户位于墨西哥地区,时区为:America/Tijuana。当他在视觉表示中选择:2021-10-05时,在结果文本中我有-1天,2021-10-04。对于 RU 地区,一切正常。这是代码:

public void startDateSelectionPicker() {
    try {
        MaterialDatePicker<Long> picker = MaterialDatePicker.Builder.datePicker()
                .setSelection(MaterialDatePicker.todayInUtcMilliseconds())
                .setTheme(R.style.CustomDatePickerDialog)
                .build();

        picker.addOnPositiveButtonClickListener(selection -> {
            TimeZone t = TimeZone.getDefault();
            Calendar c1 = Calendar.getInstance();
            c1.setTimeInMillis(selection);
            c1.setTimeZone(TimeZone.getDefault());

//here I need to receive correct date, but receiving -1 from originally selected date.

            String date = ToolsManager.calendarToDate(this, c1, "yyyy-MM-dd");
        });
        picker.show(getSupportFragmentManager(), picker.getTag());
    } catch (IllegalArgumentException e) {
    }
}

public static String calendarToDate(Context context, Calendar calendar, String dateFormat) {
        if (calendar == null) {
            return null;
        }

        Locale locale …
Run Code Online (Sandbox Code Playgroud)

timezone android android-calendar java-time materialdatepicker

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

为什么 LocalDateTime 到 java.util.Date 的转换会转换为非常旧的日期?

我在将旧日期从 java.time.LocalDateTime 转换为 java.util.Date 时遇到问题

我尝试了很多变化,但它仍然具有相同的转移日期。我认为这是执行了一些奇怪的日历,但它失败了。

要解析的日期1800-01-01 00:00:00

我使用了一个非常简单的转换函数。

Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

时区 a.通过SimpleDateFormat转换 b.通过DateFormatter将LocalDateTime转换为java.util.Date
亚洲/东京 1800-01-01 00:00:00 日本标准时间 1799-12-31 23:41:01 日本标准时间
欧洲/布鲁塞尔 欧洲中部时间 1800-01-01 00:00:00 欧洲中部时间 1800 年 1 月 1 日 00:04:30
澳大利亚/悉尼 1800-01-01 00:00:00 澳大利亚东部时间 1799-12-31 23:55:08 澳大利亚东部时间
世界标准时间 1800-01-01 00:00:00 世界标准时间 1800-01-01 00:00:00 世界标准时间

A。通过 SimpleDateFormat 将 String 转换为 java.util.Date

b. 通过DateFormatter将String转换为java.time.LocalDatetime,然后将其转换为java.util.Date

现在我发现它只适用于 UTC 时区,我不能只更改软件时区,因为它会扰乱其他时区。有人知道将 java.time.LocalDateTime 转换为 java.util.Date 的其他方法吗?

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

=====以下是在扫地者的回答后添加的,以说明它并不适合所有人====

奇怪的是,它只发生在非常旧的日期,它不会发生在 1900-01-01 00:00:00,但尚未检查问题是在哪一点开始的。我在想,也许是因为18XX年的某个时候进行了调整/改变。

System.out.println(ZoneId.of("Asia/Tokyo").getRules().getOffset(LocalDateTime.parse("1800-01-01T00:00:00")));
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
System.out.println(TimeZone.getTimeZone("Asia/Tokyo").getOffset(format1.parse("1800-01-01T00:00:00").getTime()));
        
System.out.println(ZoneId.of("Asia/Tokyo").getRules().getOffset(LocalDateTime.parse("1900-01-01T00:00:00")));
SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); …
Run Code Online (Sandbox Code Playgroud)

java java.util.date java-time

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

现有年份、可选月份和可选日期的 DateTimeFormatter 验证

我们正在尝试编写一个 DateTimeFormatter 来帮助我们验证ISO 8601,该 ISO 8601 允许最终用户仅输入年份、年份和月份,或者年份、月份和日期。我们还想验证输入的日期是否确实存在。

在下面的代码中,有两个日期和日期验证表现得很时髦的示例。第一个是仅针对一年和可选月份的验证测试。这不能正确验证月份“00”。

第二个示例显示测试(NOT)因不正确的可选月份值而失败。

任何友好的指示将不胜感激。

import org.junit.jupiter.api.Test;

import java.time.LocalDate;
import java.time.Year;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.time.temporal.TemporalQuery;

import static org.junit.jupiter.api.Assertions.assertThrows;

public class DateTimeFormatterForStackOverflowTest {

    @Test
    public void test_year_or_year_and_month_not_valid() {

        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                .appendPattern("uuuu[-MM]")
                .toFormatter()
                .withResolverStyle(ResolverStyle.STRICT);

        this.expectException("1984-0", formatter, YearMonth::from, Year::from);
        // Doesn't throw exception. 
        this.expectException("1984-00", formatter, YearMonth::from, Year::from);
        // Doesn't throw exception.
        this.expectException("1984-13", formatter, YearMonth::from, Year::from);
        // Doesn't throw exception.
        this.expectException("1984-99", formatter, YearMonth::from, Year::from);
    }

    @Test …
Run Code Online (Sandbox Code Playgroud)

java java-time datetimeformatter

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

从java.time中的`ZonedDateTime`获取`Instant`

ZonedDateTime在Java 8及更高版本的java.time包中给出一个,如何获得Instant?

走另一条路(Instant→ ZonedDateTime)简单地说:

ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ) ;
Run Code Online (Sandbox Code Playgroud)

从转换到老派课程等事情需要从ZonedDateTime→开始.Instantjava.util.Date

java.util.Date date = Date.fromInstant( instant ) ;
Run Code Online (Sandbox Code Playgroud)

java datetime java-time

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

如何使用Java8计算当前和下周六之间的秒数

我需要实现功能

int secondsTillNextSaturday(LocalDateTime start);
Run Code Online (Sandbox Code Playgroud)

这与它说的相同,计算到下个星期六相对于开始时间的秒数(如果开始已经是星期六,那么它应该返回到下一个星期六之后的秒数).

例如,对于27.04.2017 00:00:00(星期四),它应返回2*24*60*60.

java java-8 java-time

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

根据ZoneId调整LocalTime

给定一个LocalTime给定的ZoneId,如何找到调整后LocalTime的UTC?

我在寻找类似的东西.atZone从LocalDateTime,但没有发现任何东西.

我怀疑我可以使用它atOffset,但我真的不明白如何使用它.

例如:

LocalTime: 15:00
ZoneId: America/Sao_Paulo (GMT -3)
Output: 18:00
Run Code Online (Sandbox Code Playgroud)

timezone localtime timezone-offset java-8 java-time

4
推荐指数
2
解决办法
2003
查看次数

是否有Oracle的官方文档说我们不应该在新项目中使用java.util.Date

我正在公司的Java 8中编写新项目.我建议使用Java 8日期时间API,但我的一位同事说新的日期时间API运行缓慢.

这是真的吗?另外,我想从Oracle获得一些官方文档,其中提到您不应该java.util.Date在新项目中使用.

java jsr310 java-time

4
推荐指数
2
解决办法
141
查看次数

带有详细时区的Java DateTimeFormatterBuilder

假设我有一个日期,例如:

2013年11月30日19:00:00.001930000东部标准时间

我试图解析使用输入DateTimeFormatterBuilder,但我想不出该怎么把为Set通用类型ZoneId是null下面.

String basePattern = "MMM dd, yyyy HH:mm:ss";
new DateTimeFormatterBuilder()
        .appendPattern(basePattern)
        .appendFraction(ChronoField.NANO_OF_SECOND,0,9, true)
        .appendZoneText(TextStyle.FULL, null)
        .toFormatter();
Run Code Online (Sandbox Code Playgroud)

java timezone datetime-parsing java-8 java-time

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

JDBC结果集检索LocalDateTime

我运行一个简单的查询来从MySQL数据库中检索一行.我得到了ResultSet,我需要从中检索一个LocalDateTime对象.我的数据库表.

CREATE TABLE `some_entity` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(45) NOT NULL,
  `text` varchar(255) DEFAULT NULL,
  `created_date_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

我需要通过id检索一些实体.

String SELECT = "SELECT ID, TITLE, TEXT, CREATED_DATE_TIME FROM some_entity WHERE some_entity.id = ?";
PreparedStatement selectPreparedStatement = connection.prepareStatement(SELECT);
try {
    selectPreparedStatement.setLong(1, id);
    ResultSet resultSet = selectPreparedStatement.executeQuery();
    if (resultSet.next()) {
        Long foundId = resultSet.getLong(1);
        String title = resultSet.getString(2);
        String text = resultSet.getString(3);
        LocalDateTime createdDateTime …
Run Code Online (Sandbox Code Playgroud)

java mysql jdbc java-time

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