בדוק אם מחרוזת היא תאריך תקף ב- Java

1. הקדמה

במדריך זה נדון בדרכים השונות לבדוק אם א חוּט מכיל תאריך תקף ב- Java.

נדון בפתרונות לפני Java 8, לאחר Java 8 ושימוש ב- Apache Commons Validator.

2. סקירת אימות תאריך

בכל פעם שאנחנו מקבלים נתונים באפליקציה כלשהי, עלינו לוודא שהם תקפים לפני שנבצע עיבוד נוסף.

במקרה של קלט תאריך, ייתכן שנצטרך לאמת את הדברים הבאים:

  • הקלט מכיל את התאריך בפורמט חוקי, כגון MM / DD / YYYY
  • החלקים השונים של הקלט הם בטווח תקף
  • הקלט מתחיל לתאריך תקף בלוח השנה

אנו יכולים להשתמש בביטויים רגולריים כדי לעשות את האמור לעיל. עם זאת, ביטויים רגולריים לטיפול בתבניות קלט ומקומות שונים הם מורכבים ונוטים לטעויות. בנוסף, הם יכולים לפגוע בביצועים.

נדון בדרכים השונות ליישום אימות תאריכים בצורה גמישה, חזקה ויעילה.

ראשית, בואו נכתוב ממשק לאימות התאריכים:

ממשק ציבורי DateValidator {בוליאני isValid (String dateStr); }

בחלקים הבאים ניישם ממשק זה באמצעות הגישות השונות.

3. אמת באמצעות פורמט תאריך

ג'אווה סיפקה מתקנים לעיצוב וניתוח תאריכים מההתחלה. פונקציונליות זו נמצאת ב פורמט תאריך מעמד מופשט ויישומו - SimpleDateFormat.

בואו נבצע את אימות התאריכים באמצעות לְנַתֵחַ שיטת ה- פורמט תאריך מעמד:

מחלקה ציבורית DateValidatorUsingDateFormat מיישמת DateValidator {private String dateFormat; Public DateValidatorUsingDateFormat (מחרוזת תאריך פורמט) {this.dateFormat = dateFormat; } @Override בוליאני ציבורי isValid (String dateStr) {DateFormat sdf = new SimpleDateFormat (this.dateFormat); sdf.setLenient (שקר); נסה את {sdf.parse (dateStr); } לתפוס (ParseException e) {return false; } להחזיר נכון; }}

מאז ה פורמט תאריך ושיעורים קשורים אינם בטוחים בחוטיםאנו יוצרים מופע חדש לכל קריאת שיטה.

לאחר מכן, בואו נכתוב את מבחן היחידה לשיעור זה:

מאמת DateValidator = DateValidatorUsingDateFormat חדש ("MM / dd / yyyy"); assertTrue (validator.isValid ("02/28/2019")); assertFalse (validator.isValid ("30/02/2019");

זה היה הפיתרון הנפוץ ביותר לפני Java 8.

4. אמת באמצעות LocalDate

Java 8 הציגה API משופר של Date and Time. זה הוסיף את LocalDate מחלקה, המייצגת את התאריך ללא זמן. שיעור זה אינו ניתן לשינוי ובטוח חוטים.

LocalDate מספק שתי שיטות סטטיות לניתוח תאריכים. שניהם משתמשים ב- DateTimeFormatter לבצע את הניתוח בפועל:

ניתוח סטטיסטי ציבורי LocalDate (טקסט CharSequence) // מנתח תאריכים באמצעות DateTimeFormatter.ISO_LOCAL_DATE ניתוח סטטיסטי ציבורי LocalDate (טקסט CharSequence, מעצב DateTimeFormatter) // מנתח תאריכים באמצעות המעצב שצוין

בואו נשתמש ב- לְנַתֵחַ שיטה ליישום אימות התאריכים:

מחלקה ציבורית DateValidatorUsingLocalDate מיישמת DateValidator {private DateTimeFormatter dateFormatter; DateValidatorUsingLocalDate פומבי (DateTimeFormatter dateFormatter) {this.dateFormatter = dateFormatter; } @Override בוליאני ציבורי isValid (מחרוזת dateStr) {נסה {LocalDate.parse (dateStr, this.dateFormatter); } לתפוס (DateTimeParseException e) {return false; } להחזיר נכון; }}

היישום משתמש בא DateTimeFormatter אובייקט לעיצוב. מכיוון שהשיעור הזה אינו בטוח בפתיל, אנו משתמשים באותה מופע בכל שיחות שיטה שונות.

בואו נוסיף גם מבחן יחידה ליישום זה:

DateTimeFormatter dateFormatter = DateTimeFormatter.BASIC_ISO_DATE; Validator DateValidator = DateValidatorUsingLocalDate חדש (dateFormatter); assertTrue (validator.isValid ("20190228")); assertFalse (validator.isValid ("20190230"));

5. אמת באמצעות DateTimeFormatter

בחלק הקודם ראינו את זה LocalDate משתמש ב- DateTimeFormatter אובייקט לניתוח. אנחנו יכולים גם להשתמש ב- DateTimeFormatter בכיתה ישירות לעיצוב ולניתוח.

DateTimeFormatter מנתח טקסט בשני שלבים. בשלב 1, הוא מנתח את הטקסט לשדות תאריך ושעה שונים בהתבסס על התצורה. בשלב 2 הוא פותר את השדות המנותחים לאובייקט תאריך ו / או זמן.

ה ResolverStyle שלב 2. תכונות שולטות. זהו enum בעלי שלושה ערכים אפשריים:

  • LENIENT - פותר תאריכים ושעות ברכות
  • SMART - פותר תאריכים ושעות בצורה מושכלת
  • STRICT - פותר תאריכים ושעות בקפדנות

עכשיו, בואו נכתוב את אימות התאריכים באמצעות DateTimeFormatter באופן ישיר:

מחלקה ציבורית DateValidatorUsingDateTimeFormatter מיישם DateValidator {פרטי DateTimeFormatter dateFormatter; פומבי DateValidatorUsingDateTimeFormatter (DateTimeFormatter dateFormatter) {this.dateFormatter = dateFormatter; } @Override בוליאני ציבורי isValid (מחרוזת dateStr) {נסה {this.dateFormatter.parse (dateStr); } לתפוס (DateTimeParseException e) {return false; } להחזיר נכון; }}

לאחר מכן, בואו נוסיף את מבחן היחידה לשיעור זה:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern ("uuuu-MM-dd", Locale.US) .withResolverStyle (ResolverStyle.STRICT); מאמת DateValidator = DateValidatorUsingDateTimeFormatter חדש (dateFormatter); assertTrue (validator.isValid ("2019-02-28")); assertFalse (validator.isValid ("2019-02-30"));

במבחן הנ"ל אנו יוצרים a DateTimeFormatter בהתבסס על דפוס ומיקום. אנו משתמשים ברזולוציה המחמירה לתאריכים.

6. אמת באמצעות Apache Commons Validator

פרויקט Apache Commons מספק מסגרת אימות. זה מכיל שגרות אימות, כגון תאריך, שעה, מספרים, מטבע, כתובת IP, דוא"ל וכתובת אתר.

למטרתנו במאמר זה, בואו נסתכל על ה- GenericValidator בכיתה, המספקת כמה שיטות לבדוק אם א חוּט מכיל תאריך חוקי:

ציבור בוליאני סטטי ציבורי isDate (ערך מחרוזת, אזור מקומי) בוליאני סטטי ציבורי isDate (ערך מחרוזת, תאריך מחרוזת תבנית, בוליאנית קפדנית)

כדי להשתמש בספריה, בואו נוסיף את ה- validator-commons תלות Maven לפרויקט שלנו:

 commons-validator commons-validator 1.6 

לאחר מכן, בואו נשתמש ב- GenericValidator כיתה לאימות תאריכים:

assertTrue (GenericValidator.isDate ("2019-02-28", "yyyy-MM-dd", נכון)); assertFalse (GenericValidator.isDate ("2019-02-29", "yyyy-MM-dd", נכון));

7. מסקנה

במאמר זה בדקנו את הדרכים השונות לבדוק אם א חוּט מכיל תאריך תקף.

כרגיל, ניתן למצוא את קוד המקור המלא ב- GitHub.