001// -------------------------------------------------------------------------------- 002// Copyright 2002-2024 Echo Three, LLC 003// 004// Licensed under the Apache License, Version 2.0 (the "License"); 005// you may not use this file except in compliance with the License. 006// You may obtain a copy of the License at 007// 008// http://www.apache.org/licenses/LICENSE-2.0 009// 010// Unless required by applicable law or agreed to in writing, software 011// distributed under the License is distributed on an "AS IS" BASIS, 012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013// See the License for the specific language governing permissions and 014// limitations under the License. 015// -------------------------------------------------------------------------------- 016 017package com.echothree.util.server.string; 018 019import com.echothree.model.control.user.server.control.UserControl; 020import com.echothree.model.data.party.server.entity.DateTimeFormat; 021import com.echothree.model.data.party.server.entity.TimeZone; 022import com.echothree.model.data.user.server.entity.UserVisit; 023import com.echothree.util.common.string.DateFormatter; 024import com.echothree.util.common.string.DateTimeFormatType; 025import com.echothree.util.common.string.DateTimeFormatter; 026import com.echothree.util.server.persistence.Session; 027import java.time.Instant; 028import java.time.LocalDate; 029import java.time.LocalTime; 030import java.time.ZoneId; 031 032public class DateUtils { 033 034 private DateUtils() { 035 super(); 036 } 037 038 private static class DateUtilsHolder { 039 static DateUtils instance = new DateUtils(); 040 } 041 042 public static DateUtils getInstance() { 043 return DateUtilsHolder.instance; 044 } 045 046 private final java.time.format.DateTimeFormatter dateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMdd"); 047 048 public String formatDate(UserVisit userVisit, Integer date) { 049 String result = null; 050 051 if(date != null) { 052 var userControl = Session.getModelController(UserControl.class); 053 var localDate = LocalDate.parse(date.toString(), dateTimeFormatter); 054 var resultDateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern(userControl.getPreferredDateTimeFormatFromUserVisit(userVisit).getLastDetail().getJavaShortDateFormat()); 055 056 result = resultDateTimeFormatter.format(localDate); 057 } 058 059 return result; 060 } 061 062 protected UserControl getUserControl() { 063 return Session.getModelController(UserControl.class); 064 } 065 066 protected TimeZone getTimeZone(UserVisit userVisit) { 067 return getUserControl().getPreferredTimeZoneFromUserVisit(userVisit); 068 } 069 070 protected String getJavaTimeZoneName(final UserVisit userVisit) { 071 return getTimeZone(userVisit).getLastDetail().getJavaTimeZoneName(); 072 } 073 074 protected ZoneId getJavaTimeZone(final UserVisit userVisit) { 075 return ZoneId.of(getJavaTimeZoneName(userVisit)); 076 } 077 078 protected DateTimeFormat getDateTimeFormat(final UserVisit userVisit) { 079 return getUserControl().getPreferredDateTimeFormatFromUserVisit(userVisit); 080 } 081 082 protected String formatDateUsingShortDateFormat(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Instant instant) { 083 var dateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern(dateTimeFormat.getLastDetail().getJavaShortDateFormat()); 084 var localDate = LocalDate.ofInstant(instant, getJavaTimeZone(userVisit)); 085 086 return localDate.format(dateTimeFormatter); 087 } 088 089 protected String formatTimeUsingTimeFormatSeconds(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Instant instant) { 090 var dateTimeFormatter = java.time.format.DateTimeFormatter.ofPattern(dateTimeFormat.getLastDetail().getJavaTimeFormatSeconds()); 091 var localTime = LocalTime.ofInstant(instant, getJavaTimeZone(userVisit)); 092 093 return localTime.format(dateTimeFormatter); 094 } 095 096 public String formatTypicalDateTime(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Instant instant) { 097 return instant == null || dateTimeFormat == null ? null : formatDateUsingShortDateFormat(userVisit, dateTimeFormat, instant) + ' ' + formatTimeUsingTimeFormatSeconds(userVisit, dateTimeFormat, instant); 098 } 099 100 public String formatTypicalDateTime(final UserVisit userVisit, final Instant instant) { 101 return formatTypicalDateTime(userVisit, getDateTimeFormat(userVisit), instant); 102 } 103 104 public String formatTypicalDateTime(final UserVisit userVisit, final DateTimeFormat dateTimeFormat, final Long time) { 105 return time == null || dateTimeFormat == null ? null : formatTypicalDateTime(userVisit, dateTimeFormat, Instant.ofEpochMilli(time)); 106 } 107 108 public String formatTypicalDateTime(final UserVisit userVisit, final Long time) { 109 return formatTypicalDateTime(userVisit, getDateTimeFormat(userVisit), time); 110 } 111 112 public DateFormatter getDateFormatter(final UserVisit userVisit, final DateTimeFormatType dtft) { 113 var dtfd = getDateTimeFormat(userVisit).getLastDetail(); 114 String pattern; 115 116 switch(dtft) { 117 case SHORT_DATE -> pattern = dtfd.getJavaShortDateFormat(); 118 case ABBREV_DATE -> pattern = dtfd.getJavaAbbrevDateFormat(); 119 case ABBREV_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaAbbrevDateFormatWeekday(); 120 case LONG_DATE -> pattern = dtfd.getJavaLongDateFormat(); 121 case LONG_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaLongDateFormatWeekday(); 122 default -> throw new IllegalArgumentException(); 123 } 124 125 return new DateFormatter(pattern); 126 } 127 128 public DateTimeFormatter getDateTimeFormatter(final UserVisit userVisit, final DateTimeFormatType dtft) { 129 var dtfd = getDateTimeFormat(userVisit).getLastDetail(); 130 String pattern; 131 132 switch(dtft) { 133 case SHORT_DATE -> pattern = dtfd.getJavaShortDateFormat(); 134 case ABBREV_DATE -> pattern = dtfd.getJavaAbbrevDateFormat(); 135 case ABBREV_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaAbbrevDateFormatWeekday(); 136 case LONG_DATE -> pattern = dtfd.getJavaLongDateFormat(); 137 case LONG_DATE_WITH_WEEKDAY -> pattern = dtfd.getJavaLongDateFormatWeekday(); 138 case TIME -> pattern = dtfd.getJavaTimeFormat(); 139 case TIME_WITH_SECONDS -> pattern = dtfd.getJavaTimeFormatSeconds(); 140 default -> throw new IllegalArgumentException(); 141 } 142 143 return new DateTimeFormatter(getJavaTimeZoneName(userVisit), pattern); 144 } 145 146}