这两种方法等效吗?
版本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)
是否存在任何隐含的差异?如果是,我应该选择哪一个?
由于某些未知原因,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
我在将旧日期从 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) 我们正在尝试编写一个 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) 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) 我需要实现功能
int secondsTillNextSaturday(LocalDateTime start);
Run Code Online (Sandbox Code Playgroud)
这与它说的相同,计算到下个星期六相对于开始时间的秒数(如果开始已经是星期六,那么它应该返回到下一个星期六之后的秒数).
例如,对于27.04.2017 00:00:00(星期四),它应返回2*24*60*60.
给定一个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) 我正在公司的Java 8中编写新项目.我建议使用Java 8日期时间API,但我的一位同事说新的日期时间API运行缓慢.
这是真的吗?另外,我想从Oracle获得一些官方文档,其中提到您不应该java.util.Date在新项目中使用.
假设我有一个日期,例如:
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) 我运行一个简单的查询来从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)