在 Java 中,Locale定义了与人们希望如何看待事物相关的事物(例如货币格式、月份名称以及一周的开始时间)。
当解析月份的名称(带有DateTimeFormatter)时,它开始变得棘手。
如果您使用Locale.US或Locale.ENGLISH则九月有缩写形式Sep。
如果您使用Locale.UK,那么 September 在 Java 11 中也有缩写形式Sep……但是当您尝试 Java 17 时,它就会有Sept(因为 Unicode CLDR 端发生了变化,我询问这是否正确)。
结果是,当我尝试使用 Java 17 进行构建时,我的测试开始失败。
我当前的代码使用Locale.UK而不是Locale.ENGLISH因为在Java中Locale.ENGLISH实际上不仅是英语,而且还是非ISO美国定义一周的方式(他们使用星期日作为一周的第一天)。我想以 ISO 方式获得它。
简单地:
WeekFields.ISO= WeekFields.of(Locale.UK)=WeekFields[MONDAY,4]WeekFields.of(Locale.ENGLISH)= WeekFields.of(Locale.US)=WeekFields[SUNDAY,1]因此,从 Java 17 开始,我还无法找到可以正常工作的内置语言环境。
在我看来,我必须选择Locale.ENGLISH并将9 月的简称更改为我需要的WeekFields。Locale.UK
我的问题是如何做到这一点(在 Java 17 中)?
或者有更好的方法来解决这个问题吗?
更新1:
为什么这个测试通过,而月份值显然是无效的(13)?
@Test
public void test() {
String format = "uuuuMM";
String value = "201713";
DateTimeFormatter.ofPattern(format).withResolverStyle(ResolverStyle.STRICT)
.parse(value);
}
Run Code Online (Sandbox Code Playgroud)
使用时态查询时,会DateTimeParseException抛出预期:
DateTimeFormatter.ofPattern(format).withResolverStyle(ResolverStyle.STRICT)
.parse(value, YearMonth::from);
Run Code Online (Sandbox Code Playgroud)
没有TemporalQuery指定时会发生什么?
编辑:13值似乎是一个特殊的值,因为我学到了ΦXocę웃Пepeúpaツ的答案(见Undecimber).
但是,即使使用其他值,例如50,也不会抛出异常:
@Test
public void test() {
String format = "uuuuMM";
String value = "201750";
DateTimeFormatter.ofPattern(format).withResolverStyle(ResolverStyle.STRICT)
.parse(value);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个泛型方法来返回ZonedDateTime给定的日期String及其格式.
如果未在日期中指定,我们如何ZonedDateTime使用默认值?ZoneIdString
它可以用java.util.Calendar,但我想使用Java 8时间API.
这里的问题是使用固定的时区.我将格式指定为参数.日期及其格式都是String参数.更通用.
代码和输出如下:
public class DateUtil {
/** Convert a given String to ZonedDateTime. Use default Zone in string does not have zone. */
public ZonedDateTime parseToZonedDateTime(String date, String dateFormat) {
//use java.time from java 8
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, formatter);
return zonedDateTime;
}
public static void main(String args[]) {
DateUtil dateUtil = new DateUtil();
System.out.println(dateUtil.parseToZonedDateTime("2017-09-14 15:00:00+0530", "yyyy-MM-dd HH:mm:ssZ"));
System.out.println(dateUtil.parseToZonedDateTime("2017-09-14 …Run Code Online (Sandbox Code Playgroud) 我正在为我们的应用设定标准.
我一直在想,我应该选择使用什么默认日期格式?
它应该是:
谢谢你,
马克西姆.
如何从已针对UTC调整的字符串创建DateTime var?我在设置为BST(GMT + 1)的机器上运行它.如果我运行以下代码行:
DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00");
Run Code Online (Sandbox Code Playgroud)
然后在对数据库保存(UTC)值的测试中使用该值,然后看起来Convert.ToDateTime()实际上给我的UTC值为14:20.我不希望它进行转换 - 我只是希望它接受我的DateTime字符串已经是UTC.
谢谢.
我正在尝试编写一个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解析成的方法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
我在java中解析日期时遇到了麻烦,我有一个奇怪的日期时间格式.如何解析2013-04-03T17:04:39.9430000+03:00java中的日期时间以在java中格式化dd.MM.yyyy HH:mm?
我正在尝试创建一个DateTimeformatter以验证以下日期时间:
String date1 = "2017-07-06T17:25:28";
String date2 = "2017-07-06T17:25:28.1";
String date3 = "2017-07-06T17:25:28.12";
String date4 = "2017-07-06T17:25:28.123";
String date5 = "2017-07-06T17:25:28.1234";
String date6 = "2017-07-06T17:25:28.12345";
String date7 = "2017-07-06T17:25:28.123456";
String date8 = "2017-07-06T17:25:28.";
Run Code Online (Sandbox Code Playgroud)
我已尝试使用以下日期时间格式器来验证上述日期:
public static final String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
.appendPattern(DATE_TIME_FORMAT_PATTERN)
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
.toFormatter();
Run Code Online (Sandbox Code Playgroud)
它工作正常,所有上述日期,但根据我的要求就应该失败java.time.format.DateTimeParseException的date8.
注意:我知道我可以使用以下格式化程序获得预期的结果:
DateTimeFormatter formatter2 = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][.SSSSS][.SSSS][.SSS][.SS][.S]");
Run Code Online (Sandbox Code Playgroud)
但我想知道我们可以通过改变来实现预期的结果formatter1吗?
要解析我使用的日期:
LocalDateTime.parse(date1, formatter1);
Run Code Online (Sandbox Code Playgroud) 我有一个具有时间戳属性的模型:
class Model {
@JsonProperty("timestamp")
private OffsetDateTime timestamp;
}
Run Code Online (Sandbox Code Playgroud)
时间戳的格式如下:
2017-09-17 13:45:42.710576+02
Run Code Online (Sandbox Code Playgroud)
OffsetDateTime 无法解析这个:
com.fasterxml.jackson.databind.exc.InvalidFormatException:无法
java.time.OffsetDateTime从字符串"2017-09-17 13:45:42.710576 + 02" 反序列化类型的值:文本'2017-09-17 13:45:42.710576 + 02'可以不能在索引10处解析
我怎样才能解决这个问题?