标签: datetime-parsing

在 Java 中自定义区域设置

在 Java 中,Locale定义了与人们希望如何看待事物相关的事物(例如货币格式、月份名称以及一周的开始时间)。

当解析月份的名称(带有DateTimeFormatter)时,它开始变得棘手。

如果您使用Locale.USLocale.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 月的简称更改为我需要的WeekFieldsLocale.UK

我的问题是如何做到这一点(在 Java 17 中)?

或者有更好的方法来解决这个问题吗?


更新1:

  • 我已经收到 Unicode 人员的反馈,表明 …

java locale datetime-parsing java-17

9
推荐指数
1
解决办法
1348
查看次数

为什么Java 8 DateTimeFormatter在ResolverStyle.STRICT模式下允许不正确的月份值?

为什么这个测试通过,而月份值显然是无效的(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)

datetime-parsing java-8 java-time

8
推荐指数
1
解决办法
511
查看次数

Java 8 Time API - ZonedDateTime - 在解析时指定默认的ZoneId

我正在尝试编写一个泛型方法来返回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)

java timezone datetime-parsing java-time zoneddatetime

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

使用什么系统默认日期格式?

我正在为我们的应用设定标准.

我一直在想,我应该选择使用什么默认日期格式?

它应该是:

  • 国际化和时区意识,格式应该能够代表用户当地时间
  • 可以通过SimpleDataFormat(或类似的,仅jdk类)有效地解析
  • 编程语言不可知(可以解析java,python,上帝禁止C++ :)和co.)
  • 优选基于ISO或其他公认的标准
  • 易于通过HTTP进行通信(如果需要,JSON或YAML或此类性质的东西)
  • 可以表示时间到秒的分辨率(越精确越好,微秒如果可能).
  • 人类可读是一个加号,但不是必需的
  • 紧凑是一个加号,但不是必需的

谢谢你,
马克西姆.

java standards datetime datetime-format datetime-parsing

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

从字符串创建DateTime而不应用时区或夏令时

如何从已针对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.

谢谢.

.net c# timezone datetime datetime-parsing

7
推荐指数
3
解决办法
2万
查看次数

DateTimeFormatter接受多个日期并转换为一个日期(java.time库)

我正在尝试编写一个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)

java datetime datetime-format datetime-parsing java-time

7
推荐指数
1
解决办法
4559
查看次数

如何用java中的两个或三个毫秒数字解析日期时间?

这是我将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

7
推荐指数
3
解决办法
2930
查看次数

在java中解析ISO-8601 DateTime

我在java中解析日期时遇到了麻烦,我有一个奇怪的日期时间格式.如何解析2013-04-03T17:04:39.9430000+03:00java中的日期时间以在java中格式化dd.MM.yyyy HH:mm

java datetime datetime-parsing

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

如何使用可选的秒参数创建DateTimeformatter

我正在尝试创建一个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.DateTimeParseExceptiondate8.

注意:我知道我可以使用以下格式化程序获得预期的结果:

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)

java datetime-parsing java-8 java-time

6
推荐指数
1
解决办法
2115
查看次数

杰克逊:解析自定义偏移日期时间

我有一个具有时间戳属性的模型:

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处解析

我怎样才能解决这个问题?

java datetime jackson datetime-parsing java-time

6
推荐指数
1
解决办法
6765
查看次数