public class MyDateTimeFormatterTest {
private static final String BASE_PATTERN = "yyyy/MM/dd HH:mm:ss";
private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern(BASE_PATTERN + "[.SSSSSSSSS]");
private static final LocalDateTime TEST_INPUT =
LocalDateTime.of(2015, 5, 4, 12, 34, 56, 123456789);
@DataProvider(name = "test-cases")
public Iterator<Object[]> getTestCases() {
return Arrays.asList(testFor("", ChronoUnit.SECONDS),
testFor(".SSS", ChronoUnit.MILLIS),
testFor(".SSSSSS", ChronoUnit.MICROS),
testFor(".SSSSSSSSS", ChronoUnit.NANOS)).iterator();
}
@Test(dataProvider = "test-cases")
public void testWithDefaultResolution(String input, LocalDateTime output) {
assertThat(FORMATTER.parse(input, LocalDateTime::from), equalTo(output));
}
private Object[] testFor(String patternSuffix, TemporalUnit truncatedTo) {
return new Object[] …Run Code Online (Sandbox Code Playgroud) 我是java.time包的新手.我有一个LocalDate 2015-12-10.我需要将其转换为ZonedDateTime.时间应为00:00:00,区域为ZoneOffset.UTC.
转换后,ZonedDateTime应为2015-12-10T00:00:00 + 02:00.
我将LocalDate存储在名为startDate的变量中.
我试过了:
ZonedDateTime.ofInstant(Instant.from(startDate), ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)
但得到错误
java.time.DateTimeException:无法从TemporalAccessor获取Instant:2015-12-10,类型为java.time.LocalDate]
我也尝试过:
startDate.atStartOfDay().atZone(ZoneOffset.UTC)
Run Code Online (Sandbox Code Playgroud)
这给出了意外的结果.
我查看了API并尝试了其他一些方法,但到目前为止还没有运气.
有没有其他方法可以将LocalDate转换为ZonedDateTime?
您能否详细说明如何获得默认系统时区和给定时区的正确纪元时间(以毫秒为单位).
1. TimeZone:GMT + 3
2.以下代码段:
import java.time.*;
public class Main {
public static void main(String[] args) {
System.out.println(LocalDateTime
.now()
.atZone(ZoneOffset.UTC)
.toInstant()
.toEpochMilli()
);
System.out.println(LocalDateTime
.now()
.atZone(ZoneOffset.of("+3"))
.toInstant()
.toEpochMilli()
);
System.out.println(System.currentTimeMillis());
}
}
Run Code Online (Sandbox Code Playgroud)
3.输出:
1444158955508
1444148155508
1444148155508
Run Code Online (Sandbox Code Playgroud)
4.用于System.currentTimeMillis()的 JavaDoc,它告诉返回的值将是当前时间与1970年1月1日UTC午夜之间的差值(以毫秒为单位).
LocalDateTimeat 的输出GMT+3是相同的System.currentTimeMillis(),虽然System.currentTimeMillis()提到的文件UTC?LocalDateTimeat 的输出UTC不同System.currentTimeMillis(),虽然System.currentTimeMillis()提到的文件UTC?我有一个java.time.Instant创建数据字段的实体:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Item {
private String id;
private String url;
private Instant createdDate;
}
Run Code Online (Sandbox Code Playgroud)
我com.fasterxml.jackson.databind.ObjectMapper用来将项目保存为Elasticsearch作为JSON:
bulkRequestBody.append(objectMapper.writeValueAsString(item));
Run Code Online (Sandbox Code Playgroud)
ObjectMapper 将此字段序列化为对象:
"createdDate": {
"epochSecond": 1502643595,
"nano": 466000000
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试注释,@JsonFormat(shape = JsonFormat.Shape.STRING)但它对我不起作用.
我的问题是如何将此字段序列化为2010-05-30 22:15:52字符串?
反正有没有得到一个java.time(Java 8中新的)兼容时间类ResultSet?
我知道你可以使用ResultSet's getDate或者getTimestamp这些方法返回java.sql.Date/ java.sql.Timestamp对象现在已被弃用,所以使用它们来创建一个ZonedDateTime或类似的似乎是不好的做法.
我尝试过如下,但在两种情况下它都显示同一时间?我做错了什么.
LocalDateTime currentTime = LocalDateTime.now(ZoneId.of("UTC"));
Instant instant = currentTime.toInstant(ZoneOffset.UTC);
Date currentDate = Date.from(instant);
System.out.println("Current Date = " + currentDate);
currentTime.plusHours(12);
Instant instant2 = currentTime.toInstant(ZoneOffset.UTC);
Date expiryDate = Date.from(instant2);
System.out.println("After 12 Hours = " + expiryDate);
Run Code Online (Sandbox Code Playgroud)
"当前日期"时间与"12小时后"相同...
我更新到最新的Android N sdk.我唯一不理解的是为什么我无法导入java.time我的代码?我认为Java8可以通过Android N获得.那么为什么谷歌没有添加java.time包?
我需要从字符串中解析持续时间.Java 8提供了一种以ISO-8601标准为基础的方法:
Duration.parse("p10d"); // parses as ten days
Duration.parse("pt1h"); // parses as one hour
Run Code Online (Sandbox Code Playgroud)
由于标准规定"允许通过共同协议省略'T'字符",持续时间的一些Javadoc示例中的一些例子都没有T.据他们说,以下表达式应解析为"-6小时+3分钟":
"P-6H3M"
Run Code Online (Sandbox Code Playgroud)
但是我发现所有的表达都省略了T抛出a DateTimeParseException.这是方法中的错误parse()还是我遗漏了什么?
我希望有一个看起来像的API
public static long toMillis ( long duration, ChronoUnit unit ) {
// magic duration to millis
}
toMillis( 5, ChronoUnit.SECONDS); // 5000
Run Code Online (Sandbox Code Playgroud)
当然,我实际上并没有写作,toMillis但这基本上就是我想要做的.
我需要转换java.util.Date到String的yyyy-MM-dd格式在一个大的数额.
我刚刚转到java 8并想知道如何正确地做到这一点.我使用Java 7的解决方案如下:
DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT_PATTERN)
DATE_FORMATTER.print(value.getTime())
Run Code Online (Sandbox Code Playgroud)
它帮助我不创建大量冗余对象.
所以现在当我转到java 8时,我想要正确地重写它,但是:
LocalDate.fromDateFields(value).toString())
Run Code Online (Sandbox Code Playgroud)
每次都创建新LocalDate对象,这为GC提供了大量的工作.
有什么方法可以解决我的问题吗?性能和线程安全非常重要.
经过一些测试后,我发现即使创建新的对象构造:
new SimpleDateFormat("yyyy-MM-dd")).format(value))
Run Code Online (Sandbox Code Playgroud)
这个话题最快.