Date en chinois(2021Année09Mois11Jour Et 2.〇Le 11 septembre 21 )Souvent utilisé dans la vie,2021Année09Mois11La journée est bien gérée pour l'utilisation directe des modèles:yyyyAnnéeMMMoisddJour;2.〇Le 11 septembre 21, c'était plutôt mal géré,Chaque chiffre est nécessaire pour le jugement de conversion,Les tableaux etHashMapPour améliorer l'efficacité et simplifier le Code.

1.Classe d'énumération de conversion numérique

Plus critique,Oui.0À31Associé au chinois,Générer un tableau etHashMap.

package com.xkzhangsan.time.enums;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier; import com.xkzhangsan.time.utils.CollectionUtil;
import com.xkzhangsan.time.utils.CommonCache; /**
* Liste des numéros de date chinois
*
* @author xkzhangsan
*/
public enum ChineseDateDigitEnum { ZERO("〇"),
ONE("Un."),
TWO("2."),
THREE("Trois"),
FOUR("Quatre"),
FIVE("Cinq"),
SIX("Six"),
SEVEN("Sept"),
EIGHT("Huit"),
NINE("Neuf"),
TEN("Dix"),
ELEVEN("Onze"),
TWELVE("Douze"),
THIRTEEN("XIII."),
FOURTEEN("XIV."),
FIFTEEN("Quinze."),
SIXTEEN("16."),
SEVENTEEN("XVII."),
EIGHTEEN("Dix - huit."),
NINETEEN("XIX."),
TWENTY("Vingt."),
TWENTYONE("Vingt et un."),
TWENTYTWO("Vingt - deux."),
TWENTYTHREE("Vingt - trois."),
TWENTYFOUR("Vingt - quatre."),
TWENTYFIVE("Vingt - cinq."),
TWENTYSIX("Vingt - six."),
TWENTYSEVEN("27."),
TWENTYEIGHT("Vingt - huit."),
TWENTYNINE("29."),
THIRTY("30."),
THIRTYONE("31."); public static final ChineseDateDigitEnum[] ENUMS = ChineseDateDigitEnum.values(); public static final String CHINESE_DATE_DIGIT_MAP = "CHINESE_DATE_DIGIT_MAP"; private String chineseDigit; private ChineseDateDigitEnum(String chineseDigit) {
this.chineseDigit = chineseDigit;
} public String getChineseDigit() {
return chineseDigit;
} @SuppressWarnings("unchecked")
public static Integer getIndexUseCache(String chineseDigit){
Map<String, Integer> chineseDateDigitMap = new HashMap<>(32); //Cache de requête
chineseDateDigitMap = (Map<String, Integer>)CommonCache.get(CHINESE_DATE_DIGIT_MAP); // Cache existe , Retour au cache
if(CollectionUtil.isNotEmpty(chineseDateDigitMap)){
return chineseDateDigitMap.get(chineseDigit);
} // Le cache n'existe pas , Définissez d'abord le cache puis retournez à
Supplier<Object> supplier = new Supplier<Object>() {
@Override
public Object get() {
Map<String, Integer> dateDigitMap = new HashMap<>(); for(ChineseDateDigitEnum chineseDateDigitEnum : ENUMS){
dateDigitMap.put(chineseDateDigitEnum.getChineseDigit(), chineseDateDigitEnum.ordinal());
}
return dateDigitMap;
}
};
return ((Map<String, Integer>)CommonCache.get(CHINESE_DATE_DIGIT_MAP, supplier)).get(chineseDigit);
} }

2.Formatage

ChineseDateDigitEnum.ENUMS[localDateTime.getDayOfMonth()] , Valeur en énumérant les indices du tableau ,Très efficace.
 /**
* Format de date chinois ,isUpperCase false:2021Année09Mois11Jour true: 2.〇Le 11 septembre 21
* @param date Date
* @param isUpperCase En majuscules ou non ,false:2021Année09Mois11Jour true: 2.〇Le 11 septembre 21
* @return String
*/
public static String formatToChineseDateStr(Date date, boolean isUpperCase){
return formatToChineseDateStr(DateTimeConverterUtil.toLocalDateTime(date), isUpperCase);
} /**
* Format de date chinois ,isUpperCase false:2021Année09Mois11Jour true: 2.〇Le 11 septembre 21
* @param localDateTime LocalDateTime
* @param isUpperCase En majuscules ou non ,false:2021Année09Mois11Jour true: 2.〇Le 11 septembre 21
* @return String
*/
public static String formatToChineseDateStr(LocalDateTime localDateTime, boolean isUpperCase){
Objects.requireNonNull(localDateTime, "localDateTime");
if(isUpperCase){
StringBuilder buf = new StringBuilder();
//Année
String year = String.valueOf(localDateTime.getYear());
int yearLength = year.length();
for(int i=0; i<yearLength; i++){
buf.append(ChineseDateDigitEnum.ENUMS[year.charAt(i)-48].getChineseDigit());
}
buf.append("Année");
//Mois
buf.append(ChineseDateDigitEnum.ENUMS[localDateTime.getMonthValue()].getChineseDigit());
buf.append("Mois");
//Jour
buf.append(ChineseDateDigitEnum.ENUMS[localDateTime.getDayOfMonth()].getChineseDigit());
buf.append("Jour");
return buf.toString();
}else{
return format(localDateTime, YYYY_MM_DD_CN_FMT);
}
}

3.Analyse

ChineseDateDigitEnum.getIndexUseCache(dayStrArr[0]) , En convertissant la classe d'énumération de conversion numérique en HashMap, Et en utilisant le cache mapCache - le.,Très efficace.
 /**
* Résolution de la date chinoise 2021Année09Mois11Jour Ou 2.〇Le 11 septembre 21,RetourDate
* @param text 2021Année09Mois11Jour Ou 2.〇Le 11 septembre 21
* @return Date
*/
public static Date parseChineseDateStrToDate(String text){
return DateTimeConverterUtil.toDate(parseChineseDateStrToLocalDateTime(text));
} /**
* Résolution de la date chinoise 2021Année09Mois11Jour Ou 2.〇Le 11 septembre 21,RetourLocalDateTime
* @param text 2021Année09Mois11Jour Ou 2.〇Le 11 septembre 21
* @return LocalDateTime
*/
public static LocalDateTime parseChineseDateStrToLocalDateTime(String text){
if(StringUtil.isEmpty(text)){
throw new NullPointerException("text");
}
text = text.trim();
Pattern pattern = RegexEnum.NormYearFour.getPattern();
Matcher match = pattern.matcher(text);
if (match.find()){
return parseToLocalDateTime(text, YYYY_MM_DD_CN_FMT);
} else {
StringBuilder buf = new StringBuilder();
//Année
String[] yearStrArr = text.split("Année");
String yearStr = yearStrArr[0];
int yearStrLength = yearStr.length();
for(int i=0; i<yearStrLength; i++){
buf.append(ChineseDateDigitEnum.getIndexUseCache(String.valueOf(yearStr.charAt(i))));
}
int year = Integer.parseInt(buf.toString());
//Mois
String[] monthStrArr = yearStrArr[1].split("Mois");
int month = ChineseDateDigitEnum.getIndexUseCache(monthStrArr[0]);
//Jour
String[] dayStrArr = monthStrArr[1].split("Jour");
int day = ChineseDateDigitEnum.getIndexUseCache(dayStrArr[0]);
return LocalDateTime.of(year, month, day, 0, 0);
}
}

4.Tests

 /**
* Test de formatage de date en chinois
*/
@Test
public void formatToChineseDateStrTest(){
Date date = DateTimeCalculatorUtil.getDate(2021, 9, 11);
Assert.assertEquals("2021Année09Mois11Jour",DateTimeFormatterUtil.formatToChineseDateStr(date, false));
Assert.assertEquals("2.〇Le 11 septembre 21",DateTimeFormatterUtil.formatToChineseDateStr(date, true)); LocalDateTime localDateTime = LocalDateTime.of(2021, 9, 11, 0, 0);
Assert.assertEquals("2021Année09Mois11Jour",DateTimeFormatterUtil.formatToChineseDateStr(localDateTime, false));
Assert.assertEquals("2.〇Le 11 septembre 21",DateTimeFormatterUtil.formatToChineseDateStr(localDateTime, true));
} /**
* Test de résolution de la date chinoise
*/
@Test
public void parseChineseDateStrToDateTest(){
Date date = DateTimeCalculatorUtil.getDate(2021, 8, 31);
Assert.assertEquals(date, DateTimeFormatterUtil.parseChineseDateStrToDate("2021Année08Mois31Jour"));
Assert.assertEquals(date, DateTimeFormatterUtil.parseChineseDateStrToDate("2.〇 Le 31 août 21 ")); LocalDateTime localDateTime = LocalDateTime.of(2021, 8, 31, 0, 0);
Assert.assertEquals(localDateTime, DateTimeFormatterUtil.parseChineseDateStrToLocalDateTime("2021Année08Mois31Jour"));
Assert.assertEquals(localDateTime, DateTimeFormatterUtil.parseChineseDateStrToLocalDateTime("2.〇 Le 31 août 21 "));
}
Adresse du code source:https://github.com/xkzhangsan/xk-time

JavaDate HeureAPISérie42----- Plus d'articles sur une méthode efficace de formatage et d'analyse des dates chinoises

  1. JavaDate HeureAPISérie19-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APICatégorie,ZonedDateTimeAvecZoneIdEtLocalDateTimeLa relation entre,ZonedDateTime Formatage et conversion de fuseaux horaires, etc. .

    AdoptionJavaDate HeureAPISérie6-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet API Schéma de la plage de temps dans la classe : C'est clair ZonedDateTimeéquivalent àLocalDateTime+ZoneI ...

  2. JavaDate HeureAPISérie8-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APIClasseLocalDateAnalyse des sources

    Table des matières 0.Préface 1.TemporalAccessorCode source 2.TemporalCode source 3.TemporalAdjusterCode source 4.ChronoLocalDateCode source 5.LocalDateCode source 6.Total ...

  3. JavaDate HeureAPISérie11-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APICatégorie,Utiliserjava8Date HeureAPI Réécrire le calendrier lunaire LunarDate

    AdoptionJavaDate HeureAPISérie7-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet API Avantages de la classe ,java8A de nombreux avantages, Les classes d'outils de conversion du calendrier lunaire actuellement disponibles en ligne sont basées sur jdk7 Et les classes précédentes ont écrit ,Utiliser ci - dessousja ...

  4. JavaDate HeureAPISérie12-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APICatégorie,Format de la date, Format de date commun complet

    AdoptionJavaDate HeureAPISérie10-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APIClasseDateTimeFormatter, Comme vous pouvez le voir,java8DeDateTimeFormatterParfait. ...

  5. JavaDate HeureAPISérie13-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APICatégorie, Conversion de classe de temps ,DateTourne.LocalDateTime,LocalDateTimeTourne.DateAttendez.

    Comme vous pouvez le voir dans les blogs précédents Jdk8Moyennejava.time Nouvelle date et heure dans le paquet API La classe est bien conçue ,Mais...Date Comme l'utilisation est encore très répandue ,Cela impliqueDateTourne.LocalDateTime,LocalDateTimeTourne.D ...

  6. JavaDate HeureAPISérie6-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APICatégorie

    Parce queJdk7 Problèmes d'utilisation gênante et problèmes de sécurité des fils pour les classes de date et d'heure précédentes ,2005Année,Stephen ColebourneCrééJoda-TimeBibliothèque, Autre date et heure API.StephenVersJCPSoumis ...

  7. JavaDate HeureAPISérie7-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet API Caractéristiques de la classe

    1.Invariance Nouvelle date/TempsAPIMoyenne, Toutes les classes sont immuables , C'est bon pour les environnements multithreadés . Par exemple,:LocalDateTime 2.Séparation des préoccupations NouveauAPI Date et heure lisibles par l'homme et heure de la machine (unix timestamp ...

  8. JavaDate HeureAPISérie21-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APICatégorie,xk-timeConversion du temps,Calcul,Formatage, Outils d'analyse

    En dehors du travail ,C'est exact.Java8Moyennejava.time L'apprentissage continu du code source , Utilisation et résumé ,Développéxk-time, Achèvement préliminaire , Les essais et les suggestions sont les bienvenus ! xk-time xk-time is a datetime conve ...

  9. JavaDate HeureAPISérie2-----Jdk7 Et les classes de date et d'heure précédentes sont mysql Applications dans la base de données

    1.java Classe de temps liée à la base de données dans javaOffre etmysql Trois types de données pour une interaction facile : java.sql.Date java.sql.Time java.sql.Timestamp Ce sont des héritages java ...

  10. JavaDate HeureAPISérie10-----Jdk8Moyennejava.time Nouvelle date et heure dans le paquet APIClasseDateTimeFormatter

    1.DateTimeFormatter finalModification,Sécurité des fils, Pour imprimer et analyser les dates - Formateur d'objets temporels . CréationDateTimeFormatter: DateTimeFormatter dateTi ...

Recommandation aléatoire

  1. XMLNotes d'étude3——XSDBrève description

    Le langage actuel , Si ce n'est pas le cas OOL'ombre de, J'ai honte de l'appeler langue .InXML Les contraintes sémantiques de ,DTDBien que simple, Mais pas assez puissant , Une description tout à fait claire , Il y a donc une autre alternative DTDDeXSD(XML Schema Defi ...

  2. ibatisUtilisé danslikeRequête floue

    select * from table1 where name like '%#name#%' Deux méthodes efficaces : 1) Utiliser$Remplacer#. Cette méthode consiste à supprimer la vérification de type , Connexion par chaîne , Mais il pourrait y avoir sqlInjection ...

  3. MSSQL Note 2 MSSQLDéclencheur pour

    Déclencheur, C'est faire une montre DMLPendant l'opération, Déclenche d'autres événements , Les déclencheurs sont généralement utilisés pour check Contraintes plus complexes contraintes ci - dessus , Est une procédure stockée spéciale , Ne peut pas être appelé de façon proactive . La syntaxe est la suivante:: CREATE TRIGGER trigg ...

  4. StormSérie(16.) Analyse architecturale Executor-Bolt

    Préparer les données pour la boucle de message Prototype de fonction: 1  let[executor-sampler (mk-stats-sampler (:storm-conf executor-data))] Principales fonctions: Définitiontupl ...

  5. socket.ioRéalisation

    Code de fond index_server.js var app = require('http').createServer(handler)//Créer un serveurapp , io = require('socke ...

  6. À propos de MyBatis MyBatis-Spring Jdbc Analyse comparative de l'insertion par lots

    Parce que pour l'instant,SMEUn programme SPIDER - crawler a été écrit dans le cadre du projet.,Par conséquent, la quantité de données insérées dans la base de données augmente considérablement..Utilisé dans le projet3EspèceDBLa méthode d'insertion a étéDemoAnalyse: Les codes spécifiques sont les suivants:: 1: MyBatis OuvertBatchComment,Le plus commun ...

  7. JAVANotes d'étude(2)—— java Initialisation des trois principes

    1. Principe d'initialisation (1)   Objets statiques(Variables) Priorité sur les objets non statiques (Variables)Initialisation, Où les objets statiques (Variables) Initialiser une fois , Objets non statiques (Variables) Peut être initialisé plusieurs fois . (2)   Initialisation de la classe parent avant la classe Enfant (3)   Selon ...

  8. pythonProgrammation réseau(XIII.)

    Co - Process-greenletÉdition Pour une meilleure utilisation des co - routines pour accomplir des tâches multiples ,pythonDansgreenlet Les modules les encapsulent , Cela rend la tâche de commutation plus facile Mode d'installation Utilisez la commande suivante pour installergreenletModule: sudo pip ...

  9. aircrack-ng Background Running Bag , Envoyer automatiquement une notification par courriel après le succès

    Mon idée est d'utiliser nohup Structure de sortie du démon vers le fichier spécifié , Ensuite, jugez dans le dossier "KEY FOUND"Champs pour. Démarrageaircrack-ngComment nohup aircrack-ng -w /o ...

  10. JavaWeb Problèmes d'accès inter - domaines

    Réimpression: http://blog.csdn.net/zjq_1314520/article/details/65449279 La solution finale est la suivante : In tomcat De confTrouvé dans le catalogue web.xm ...