webForumDet fria alternativet

Datumkoll

4 svar · 705 visningar · startad av crazyl

crazylMedlem sedan jan. 200232 inlägg
#1

Hej,

Jag har en sträng i formatet tex "19710210" och jag vill kolla om den motsvarar ett datum. Hur gör jag?

Mvh

dAEkMedlem sedan feb. 20041 816 inlägg
#2

Kolla på klassen SimpleDateFormat och använd "yyyyMMdd" (pattern) för att parsa din datumsträng. Det borde väl funka?

dAEkMedlem sedan feb. 20041 816 inlägg
#3

Jag var bara en bit på vägen, tydligen. Det kan t.ex. vara av intresse att veta om det är ett giltigt datum också. ;)

I alla fall. Här har du ett exempel från Suns forum:

	public static boolean isDateValid(String date, String format) {
		  try {
			  Date dateSimple = new SimpleDateFormat(format).parse(date);
			  
			  Format formatter = new SimpleDateFormat(format);
			  
			  if (!date.equals(formatter.format(dateSimple)))
				  return false;
 
			  return true;
		  }
		  catch(ParseException e) {
		    return false;
		  }
		}
	
	public static void main(String[] args) {
		if (!Utilities.isDateValid("30042006","ddMMyyyy"))
		{
			System.out.println("30-04 is not valid.");
		}
		if (!Utilities.isDateValid("31042006","ddMMyyyy"))
		{
			System.out.println("31-04 is not valid.");
		}		
	}

Det behövs verkligen ett vettigt API för datumhantering i Java.

TomasJMedlem sedan feb. 200563 inlägg
#4

dAEk skrev:

...

Det behövs verkligen ett vettigt API för datumhantering i Java.

http://joda-time.sourceforge.net/
>Joda-Time provides a quality replacement for the Java date and time classes.
>...
>JSR 310 has now been launched. It aims to build upon Joda-Time and include it in the JDK.

Så här kan man använda Joda Time för att kontrollera om en datumsträng motsvarar ett datum:

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class DateTimeUtility {

	/**
	 * @param dateString a date, e.g. "19710210" (if the dateFormat String would be "yyyyMMdd"). 
	 * If there is whitespace in the beginning or end it will be ignored, e.g. " 19710210 " should be parsed as a valid DateTime.
	 * @param dateFormat a date format e.g. "yyyyMMdd"
	 * @return a valid DateTime object if the dateString represents a correct date according to the dateFormat parameter.
	 * @throws  RuntimeException will be thrown if the input parameters will not be able to return a valid DateTime.
	 */
	public static DateTime getDateTime(final String dateStringInput, final String dateFormat) 
		throws RuntimeException { // e.g. IllegalFieldValueException
		
		final String dateString = (dateStringInput == null) ? "" : dateStringInput.trim();
		
		final DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(dateFormat);
		final DateTime dateTime = dateTimeFormatter.parseDateTime(dateString);
		return dateTime;
	}

	public static boolean isDateValid(final String dateString, final String dateFormat) {
		try {
			// final DateTime dateTime = getDateTime(dateString, dateFormat);
			// return dateTime != null;
			getDateTime(dateString, dateFormat); // return value is not needed here
			return true; 
		} catch (Exception e) { // e.g. IllegalFieldValueException
			return false;
		}
	}
}

//JUnit 4
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class DateTimeUtilityTest {
	
	private final static String DATEFORMAT = "yyyyMMdd";
	
	@Test
	public final void testIsDateValid() {
		assertTrueDates("19710228", "20070228", "20070430", "20080228", "20080229", "20080229 ", " 20080229", " 20080229 "); // 2008 är skottår
		assertFalseDates("19710229", "20070229", "20070431", "20080230", null, "", "a", "19710228a", "a19710228");
	}

	private void assertTrueDates(String... dateStrings) {
		for(String dateString: dateStrings) {
			assertTrue(dateString, DateTimeUtility.isDateValid(dateString, DATEFORMAT));
		}
	}
	
	private void assertFalseDates(String... dateStrings) {
		for(String dateString: dateStrings) {
			assertFalse(dateString, DateTimeUtility.isDateValid(dateString, DATEFORMAT));
		}
	}	
}

/ Tomas

LimeMedlem sedan sep. 2001961 inlägg
#5

Jag tänker verkligen rösta nej till Joda-Time... ;)

126 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)