标签: java-time

JSR-310中两个不同的基于周的年定义的动机是什么?

这些是包中的两个字段java.time.temporal:

IsoFields.WEEK_BASED_YEAR

WeekFields.ISO.weekBasedYear()

ISO-8601定义了除其他两种日期之外的所谓周日期,即通常的日历日期(包括年,月和日)和顺序日期(包括年和日) ).星期日的格式为YYYY-'W'ww-e.w代表一周的年份,e代表数字ISO-星期几.Y代表以周为基础的年份,与日历年相同,但在日历年的开始或结束时除外,因为基于周的年份与最终可能在上一年开始的周周期相关联.有两条规则对于理解星期日的形成非常重要:

  1. 周总是从周一开始.
  2. 日历年的第一周是包含至少四天的一周.

乍一看,两个JSR-310字段看起来都是相同的,因为ISO-8601只提到了一种基于周的年份.但是等一下,惊喜.让我们考虑以下代码示例:

LocalDate date1 = 
  LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014);
System.out.println("IsoFields-Test: " + date1); // output: 2014-03-01

LocalDate date2 = 
  LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014);
System.out.println("WeekFields-Test: " + date2); // output: 2014-02-25
Run Code Online (Sandbox Code Playgroud)

虽然我非常了解第二种变化,但我很惊讶看到第一次约会的不同结果是在其类名中使用"官方"ISO-8601-reference.要解释计算结果:

2000-02-29日期对应于ISO-weekdate-notation中的2000-W09-2,而2014-02-25对应于2014-W09-2,保留了一周中的星期和星期几.到目前为止很好.较小字段的这种保留特性类似于如何更改日历年的规则(在大多数情况下应该保持日历日期中的月份和日期不变).

但结果2014-03-01是什么?这里算法简单地将相应的周日添加了四天,以便考虑字段"日期"(29对25)的差异.我没有找到此行为的任何来源或官方文档.有谁知道我们在哪里可以找到这两个领域之间差异的理由?有关算法行为的任何文档?

更新:

现在,我尝试使用此表达式测试新API的自我一致性,以便找出更好地支持哪两个字段:

System.out.println(
  "14 week-based-years later = "
  + LocalDate.of(2000, 2, 29).plus(14, IsoFields.WEEK_BASED_YEARS));
Run Code Online (Sandbox Code Playgroud)

输出是2014-03-01类似于描述的情况IsoFields.WEEK_BASED_YEAR,尽管我仍然发现2014-02-25(= 2014-W09-2)的结果更合乎逻辑.由于此类时间单元也在类中找到,IsoFields因此行为在类中是自洽的IsoFields.看起来像一个没有文档和非直观的"功能".

我使用的版本是:java.runtime.version = 1.8.0-b132

更多测试:

LocalDate d = LocalDate.of(2014, 3, 1); // 2014-W09-6
System.out.println( …
Run Code Online (Sandbox Code Playgroud)

java iso8601 java-8 java-time

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

如何从java 8中的LocalTime中删除毫秒

使用java.time框架,我想以格式打印时间hh:mm:ss,但是以格式LocalTime.now()给出时间hh:mm:ss,nnn.我试着用DateTimeFormatter:

DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_TIME;
LocalTime time = LocalTime.now();
String f = formatter.format(time);
System.out.println(f);
Run Code Online (Sandbox Code Playgroud)

结果:

22:53:51.894
Run Code Online (Sandbox Code Playgroud)

如何从时间中删除毫秒?

java rounding localtime datetime-format java-time

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

在Java 8中使用TemporalAmount或TemporalUnit有什么区别?

我在Java 8中编写了一些使用时间算术的代码.我意识到我可以在不同的方面实施.让我们看看下面的简单代码.当然它是相同的结果,但我混淆了哪种方式主要应用或最有效地在Java 8中进行算术运算?

LocalTime time = LocalTime.now();
// 1st way
LocalTime plusOp = time.plus(Duration.ofMinutes(10L));
// 2nd way
LocalTime plusOp2 = time.plus(10L, ChronoUnit.MINUTES);
System.out.println(plusOp);
System.out.println(plusOp2);
// 3. way simply
 time.plusMinutes(10L);
Run Code Online (Sandbox Code Playgroud)

提前致谢.

java datetime java-8 java-time

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

Java 8 Date API vs Calendar/Date/DateFormat

Java 8中有一个新的n-cool Date API,即java.time包.我知道它比旧类更好的设计,更少的模糊和更多的线程安全.不过,我不知道如何使用它:

  • 我应该专门使用它而不是旧类吗?
  • 我应该更换旧课程的现有用法,因为新的东西要好得多吗?
  • 我应该避免使用java.util.Calendar, java.util.Date,java.sql.Date并java.text.DateFormat支持新的API一起还是有使用的情况下,其中的老班还是最好?
  • 由于新的Date API类似于使用Java 8流API 替换Guava FluentIterable,Joda Time API是否已经过时了?

我知道这些都是很多问题,但他们感觉彼此有些相关.如果有人可以回答整个问题,那将是非常棒的,但也可以赞赏好的部分答案.

calendar date jodatime java-8 java-time

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

如何使用Hibernate映射java.time.Year和其他java.time类型

有hibernate-java8JAR了几个类似的类提供适配器Instant,LocalDate等等,但是从一些类java.time,例如Year,Month,YearMonth失踪.这些类被存储为未知的Serializable,这是不必要的浪费.

当然我可以使用int year而不是Year year,但我不认为,这是一个好主意.

看起来YearJavaDescriptor应该很容易写,但是,我想知道为什么它会丢失.特别是在情况下YearMonth,我非常喜欢现有的适配器,不是吗?或者我做了一些愚蠢的事情?

我不确定谷歌搜索没有返回任何东西.

java hibernate java-8 java-time

14
推荐指数
2
解决办法
988
查看次数

DateTimeFormatter工作日似乎是一个人

我正在将现有的应用程序从Joda-Time移植到Java 8 java.time.

我遇到了一个问题,解析包含"星期几"值的日期/时间字符串在我的单元测试中触发了异常.

解析时:

2016-12-21 20:50:25 12月周三+0000 3

使用格式:

yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ' 'e
Run Code Online (Sandbox Code Playgroud)

我明白了:

java.time.format.DateTimeParseException: 
Text '2016-12-21 20:50:25 Wednesday December +0000 3' 
could not be parsed: Conflict found: 
Field DayOfWeek 3 differs from DayOfWeek 2 derived from 2016-12-21
Run Code Online (Sandbox Code Playgroud)

当让它DateTimeFormatter表明它所期望的时候:

String logline     = "2016-12-21 20:50:25 Wednesday December +0000";
String format      = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format).withLocale(Locale.ENGLISH);;
ZonedDateTime dateTime = formatter.parse(logline, ZonedDateTime::from);

format      = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'EEEE' 'MMMM' 'ZZ' 'e";
formatter = …
Run Code Online (Sandbox Code Playgroud)

jodatime dayofweek datetime-parsing java-8 java-time

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

使用Java 8 java.time api解析ISO时间戳(仅限标准版)

我在例子中从字符串中获取毫秒数时遇到麻烦.到目前为止,我已经尝试了这三种不同的方式,示例显示了最新的尝试.似乎总是认为TemporalAccessor不支持ChronoField.如果我可以成功构建一个Instant实例,我可以使用toEpochMilli().

String dateStr = "2014-08-16T05:03:45-05:00"
TemporalAccessor creationAccessor = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(dateStr);
Instant creationDate = Instant.from(creationAccessor);
Run Code Online (Sandbox Code Playgroud)

请提供简明的答案(不要从头开始构建格式化程序)并仅使用java 8标准发行版(我可以使用Joda,但希望避免依赖项).

编辑:上面代码中的Instant.from抛出:java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {OffsetSeconds=-18000},ISO resolved to 2014-08-16T05:03:45 of type java.time.format.Parsed

java datetime string-parsing java-8 java-time

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

将字符串解析为本地日期不会使用所需的世纪

我正在使用这个DateTimeFormatter:

DateTimeFormatter.ofPattern("ddMMYY")
Run Code Online (Sandbox Code Playgroud)

我想解析字符串150790,我得到了这个错误:

Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=15, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2090},ISO of type java.time.format.Parsed
Run Code Online (Sandbox Code Playgroud)

显然,我希望得到以下内容TemporalAccessor:

{DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990}
Run Code Online (Sandbox Code Playgroud)

你知道我为什么得到2090而不是1990年?

谢谢你的帮助

java date 2-digit-year java-time

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

如何在Java-8中显示通用时代("CE")?

以下代码不打印"CE"或"当前时代":

System.out.println(IsoEra.CE.getDisplayName(TextStyle.SHORT, Locale.UK)); // output: AD
System.out.println(IsoEra.CE.getDisplayName(TextStyle.FULL, Locale.UK)); // output: Anno Domini
Run Code Online (Sandbox Code Playgroud)

当然,IsoEra.CE.name()如果需要像"普通时代"或"当代时代"这样的完整显示名称,则有所帮助.我认为这有点奇怪,因为javadoc IsoEra在其类描述中明确提到术语"当前时代".它甚至不适用于根区域设置.这里的用例是为非宗教背景的客户提供服务.

这也没有帮助:

LocalDate date = LocalDate.now();
String year = date.format(DateTimeFormatter.ofPattern("G yyyy", Locale.UK)); // AD 2015
System.out.println(year);
Run Code Online (Sandbox Code Playgroud)

我找到的唯一方法是:

TextStyle style = ...;
Map<Long,String> eras = new HashMap<>();
long bce = (long) IsoEra.BCE.getValue(); // 0L
long ce = (long) IsoEra.CE.getValue(); // 1L
if (style == TextStyle.FULL) {
  eras.put(bce, "Before current era");
  eras.put(ce, "Current era");
} else {
  eras.put(bce, "BCE");
  eras.put(ce, "CE");
}
DateTimeFormatter dtf = 
  new …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-time

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

为什么这个日期解析失败了?

我正在尝试将字符串转换为LocalDateTime对象.

@Test
public void testDateFormat() {
   String date = "20171205014657111";
   DateTimeFormatter formatter = 
       DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
   LocalDateTime dt = LocalDateTime.parse(date, formatter);
}
Run Code Online (Sandbox Code Playgroud)

我希望这个测试能够通过.

我收到以下错误:

java.time.format.DateTimeParseException:无法在索引0处解析文本'20171205014657111'

java datetime datetime-parsing java-time

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