如何根据LocalDateTime中的时区更改时间,这里我建立了一个带有时区的日期作为EST,现在我需要找到相应时间的UTC.请帮我解决这个问题
String str = "16Jun2015_153556";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMMyyyy_HHmmss");
formatter.withZone(ZoneId.of("EST5EDT"));
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
Run Code Online (Sandbox Code Playgroud) 我正在寻找Java 8中Joda Time的等效方法,比较org.joda.time.DateTime(指定时区)的实例,忽略比较中的秒和毫秒,如下所示.
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss:SSS a Z").withZone(DateTimeZone.forID("Asia/Kolkata"));
DateTime first = formatter.parseDateTime("16-Feb-2012 12:03:45:999 AM +05:30");
DateTime second = formatter.parseDateTime("16-Feb-2012 12:03:55:999 AM +05:30");
DateTimeComparator comparator = DateTimeComparator.getInstance(DateTimeFieldType.minuteOfHour());
int compare = comparator.compare(first, second);
System.out.println("compare : " + compare);
Run Code Online (Sandbox Code Playgroud)
比较返回0意味着在忽略比较的秒和毫秒时刻之后,两个对象都被认为是相等的.
DateTimeFieldType此处忽略幅度小于指定的下限的字段.
在Java 8中使用Java Time API执行相同操作的等效方法是什么?
说实话,我尝试用Java 8实现同样的功能.
我想LocalDateTime在下一个(例如)星期一的日期/时间创建实例.
Java Time API中是否有任何方法,或者我应该计算当前日期和目标日期之间的天数,然后使用LocalDateTime.of()方法?
我试图使用Java 8新的日期模式而不是Joda,我有以下问题:
都
ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)
和
LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)
抛出'java.time.format.DateTimeParseException'异常.而
org.joda.time.DateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormat.forPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)
工作良好.
异常的原因是:
java.time.format.DateTimeParseException:无法在索引22处解析文本'02/05/16 11:51.12.083 +04:30'
难道我做错了什么?
这样的方法是ChronoUnit.HOURS.between(start, end)返回long所以我不能从那里得到分数.
是否有一种可以返回分数的替代方法/方法?
在传入的JSON中,我有一个符合ISO8601标准的日期时间字段,包含区域偏移量.我想保留这个偏移量,但不幸的是Jackson在反序列化这个字段时默认为GMT/UTC(我从http://wiki.fasterxml.com/JacksonFAQDateHandling中了解到).
@RunWith(JUnit4.class)
public class JacksonOffsetDateTimeTest {
private ObjectMapper objectMapper;
@Before
public void init() {
objectMapper = Jackson2ObjectMapperBuilder.json()
.modules(new JavaTimeModule())
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();
}
@Test
public void test() throws IOException {
final String json = "{ \"date\": \"2000-01-01T12:00:00.000-04:00\" }";
final JsonType instance = objectMapper.readValue(json, JsonType.class);
assertEquals(ZoneOffset.ofHours(-4), instance.getDate().getOffset());
}
}
public class JsonType {
private OffsetDateTime date;
// getter, setter
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到的是:
java.lang.AssertionError: expected:<-04:00> but was:<Z>
Run Code Online (Sandbox Code Playgroud)
如何使返回的OffsetDateTime包含原始偏移量?
我在Jackson 2.8.3上.
我正在尝试编写一个DateTimeFormatter允许我采用多种不同String格式的格式,然后将String格式转换为特定类型.由于项目的范围和已经存在的代码,我不能使用不同类型的格式化程序.
例如,我想接受MM/dd/yyyy以及yyyy-MM-dd'T'HH:mm:ss然后当我打印时我只想打印MM/dd/yyyy格式并在我打电话时将其格式化LocalDate.format(formatter);
有人可以建议如何用这个做到这一点 java.time.format.*;
以下是我可以做到的方式org.joda:
// MM/dd/yyyy format
DateTimeFormatter monthDayYear = DateTimeFormat.forPattern("MM/dd/yyyy");
// array of parsers, with all possible input patterns
DateTimeParser[] parsers = {
// parser for MM/dd/yyyy format
monthDayYear.getParser(),
// parser for yyyy-MM-dd'T'HH:mm:ss format
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").getParser()
};
DateTimeFormatter parser = new DateTimeFormatterBuilder()
// use the monthDayYear formatter for output (monthDayYear.getPrinter())
// and parsers array for input (parsers)
.append(monthDayYear.getPrinter(), parsers)
// create formatter (using UTC …Run Code Online (Sandbox Code Playgroud) 我试图将String日期的格式从EEEE MMMM d更改MM/d/yyyy为,首先,将其转换为a LocalDate,然后将不同模式的格式化程序应用LocalDate到String再次解析之前.
这是我的代码:
private String convertDate(String stringDate)
{
//from EEEE MMMM d -> MM/dd/yyyy
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("EEEE MMMM d"))
.toFormatter();
LocalDate parsedDate = LocalDate.parse(stringDate, formatter);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/d/yyyy");
String formattedStringDate = parsedDate.format(formatter2);
return formattedStringDate;
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到了这个我不太了解的异常消息:
Exception in thread "main" java.time.format.DateTimeParseException: Text 'TUESDAY JULY 25' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {DayOfWeek=2, MonthOfYear=7, DayOfMonth=25},ISO of type java.time.format.Parsed
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Jackson读取JSON文件,并以Java的纪元毫秒形式存储其中一个字段Instant,但是反序列化的行为不符合预期。
这是我尝试读取时间戳时看到的内容:
1503115200000
杰克逊将Instant领域设置为+49601-10-28T16:00:00Z。
发生这种情况是因为Jackson的默认设置是使用Instant.ofEpochSecond(Long l)而不是读取时间戳Instant.ofEpochMilli(Long l)。
有没有一种方法可以将Jackson设置ObjectMapper为使用该ofEpochMilli方法呢?这是我目前拥有的ObjectMapper:
ObjectMapper om = new ObjectMapper()
.registerModule(new JavaTimeModule())
.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.setSerializationInclusion(Include.NON_NULL);
Run Code Online (Sandbox Code Playgroud)
注意
如果我将输入JSON更改为ISO日期(例如)2017-08-19T04:00:00Z或epoch seconds(例如纪元秒),1503115200则Instant字段可以正确设置。
不幸的是JSON输入必须是纪元毫秒,例如1503115200000。
这是我将String解析成的方法LocalDateTime.
public static String formatDate(final String date) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS");
LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
return formatDateTime.atZone(ZoneId.of("UTC")).toOffsetDateTime().toString();
}
Run Code Online (Sandbox Code Playgroud)
但这仅适用于输入字符串,
2017-11-21 18:11:14.05
但无法2017-11-21 18:11:14.057
使用DateTimeParseException.
如何定义适用于.SS和.SSS?的格式化程序?
java datetime-format datetime-parsing java-time dateformatter