001// -------------------------------------------------------------------------------- 002// Copyright 2002-2026 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 var pattern = switch(dtft) { 115 case SHORT_DATE -> dtfd.getJavaShortDateFormat(); 116 case ABBREV_DATE -> dtfd.getJavaAbbrevDateFormat(); 117 case ABBREV_DATE_WITH_WEEKDAY -> dtfd.getJavaAbbrevDateFormatWeekday(); 118 case LONG_DATE -> dtfd.getJavaLongDateFormat(); 119 case LONG_DATE_WITH_WEEKDAY -> dtfd.getJavaLongDateFormatWeekday(); 120 default -> throw new IllegalArgumentException(); 121 }; 122 123 return new DateFormatter(pattern); 124 } 125 126 public DateTimeFormatter getDateTimeFormatter(final UserVisit userVisit, final DateTimeFormatType dtft) { 127 var dtfd = getDateTimeFormat(userVisit).getLastDetail(); 128 var pattern = switch(dtft) { 129 case SHORT_DATE -> dtfd.getJavaShortDateFormat(); 130 case ABBREV_DATE -> dtfd.getJavaAbbrevDateFormat(); 131 case ABBREV_DATE_WITH_WEEKDAY -> dtfd.getJavaAbbrevDateFormatWeekday(); 132 case LONG_DATE -> dtfd.getJavaLongDateFormat(); 133 case LONG_DATE_WITH_WEEKDAY -> dtfd.getJavaLongDateFormatWeekday(); 134 case TIME -> dtfd.getJavaTimeFormat(); 135 case TIME_WITH_SECONDS -> dtfd.getJavaTimeFormatSeconds(); 136 default -> throw new IllegalArgumentException(); 137 }; 138 139 return new DateTimeFormatter(getJavaTimeZoneName(userVisit), pattern); 140 } 141 142}