All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.linuxforhealth.hl7.data.date.DateFormats Maven / Gradle / Ivy

/*
 * (C) Copyright IBM Corp. 2020
 *
 * SPDX-License-Identifier: Apache-2.0
 */
package io.github.linuxforhealth.hl7.data.date;

import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class DateFormats {

    private static final Pattern PATTERN8 = Pattern
            .compile("^\\d{4}\\d{2}\\d{2}(\\d{0,6})(\\.\\d{0,4})[\\+|\\-]\\d{4}$");
    private static final Pattern PATTERN7 = Pattern.compile("^\\d{4}\\d{2}\\d{2}(\\d{0,6})[\\+|\\-]\\d{4}$");
    private static final Pattern PATTERN6 = Pattern.compile("^\\d{4}\\d{2}\\d{2}(\\d{0,6})(\\.\\d{0,4})$");
    private static final Pattern PATTERN5 = Pattern.compile("^\\d{4}\\d{2}\\d{2}(\\d{0,6})$");
    private static final Pattern PATTERN4 = Pattern.compile("^\\d{4}\\d{2}\\d{2}\\d{2}$");
    private static final Pattern PATTERN3 = Pattern.compile("^\\d{4}\\d{2}\\d{2}$");
    private static final Pattern PATTERN2 = Pattern.compile("^\\d{4}\\d{2}$");
    private static final Pattern PATTERN1 = Pattern.compile("^\\d{4}$");

    private static final String YYYY_MM_DD = "yyyy-MM-dd";

    static DateTimeFormatter FHIR_ZONE_DATE_TIME_FORMAT = DateTimeFormatter.ISO_OFFSET_DATE_TIME;

    private static final DateFormats dateFormats = new DateFormats();

    private DateTimeFormatter formatter;
    private Map datePatterns;
    private Map dateTimePatterns;
    private Map dateTimePatternsWithoutTime;
    private Map dateTimePatternsWithZone;

    private DateFormats() {
        this.formatter = getFormatter();
        this.datePatterns = getDatePatterns();
        this.dateTimePatterns = getDateTimePatterns();
        this.dateTimePatternsWithoutTime = getDateTimePatternsWithoutTime();
        this.dateTimePatternsWithZone = getDateTimeWithZonePatterns();
    }

    private static DateTimeFormatter getFormatter() {
        String patterns = "[yyyyMMddHHmmss.SZ][yyyyMMddHHmmss.SSZ][yyyyMMddHHmmss.SSSZ][yyyyMMddHHmmss.SSSSZ][yyyyMMddHHmmssZ]"
                + "[yyyyMMddHHmmZ][yyyyMMddHHZ][yyyyMMddZ][yyyyMMZ][yyyyZ]"
                + "[yyyyMMddHHmmss.SSSS][yyyyMMddHHmmss.SSS][yyyyMMddHHmmss.SS][yyyyMMddHHmmss.S]"
                + "[yyyyMMddHHmmss][yyyyMMddHHmm][yyyyMMddHH][yyyyMMdd][yyyyMM][yyyy]";
        return new DateTimeFormatterBuilder()
                .appendPattern(patterns).optionalStart()
                .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1).parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                .optionalEnd()
                .toFormatter();
    }

    private static Map getDatePatterns() {
        Map patterns = new HashMap<>();
        patterns.put(PATTERN1, DateTimeFormatter.ofPattern("yyyy"));
        patterns.put(PATTERN2, DateTimeFormatter.ofPattern("yyyy-MM"));
        patterns.put(PATTERN3, DateTimeFormatter.ofPattern(YYYY_MM_DD));
        patterns.put(PATTERN5, DateTimeFormatter.ofPattern(YYYY_MM_DD));
        patterns.put(PATTERN6, DateTimeFormatter.ofPattern(YYYY_MM_DD));
        patterns.put(PATTERN7, DateTimeFormatter.ofPattern(YYYY_MM_DD));
        patterns.put(PATTERN8, DateTimeFormatter.ofPattern(YYYY_MM_DD));
        return patterns;
    }

    private static Map getDateTimePatterns() {
        Map patterns = new HashMap<>();
        patterns.put(PATTERN4, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        patterns.put(PATTERN5, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        patterns.put(PATTERN6, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        return patterns;
    }

    private static Map getDateTimeWithZonePatterns() {
        Map patterns = new HashMap<>();
        patterns.put(PATTERN8, FHIR_ZONE_DATE_TIME_FORMAT);
        patterns.put(PATTERN7, FHIR_ZONE_DATE_TIME_FORMAT);
        return patterns;
    }

    private static Map getDateTimePatternsWithoutTime() {
        Map patterns = new HashMap<>();
        patterns.put(PATTERN1, DateTimeFormatter.ofPattern("yyyy"));
        patterns.put(PATTERN2, DateTimeFormatter.ofPattern("yyyy-MM"));
        patterns.put(PATTERN3, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        return patterns;
    }

    public static Map getDateTimePatternsInstance() {
        return dateFormats.dateTimePatterns;
    }

    public static Map getDatePatternsInstance() {
        return dateFormats.datePatterns;
    }

    public static Map getDatePatternsWithoutTimeInstance() {
        return dateFormats.dateTimePatternsWithoutTime;
    }

    public static Map getDatePatternsWithZoneInstance() {
        return dateFormats.dateTimePatternsWithZone;
    }

    public static DateTimeFormatter getFormatterInstance() {
        return dateFormats.formatter;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy