isValidDate()

Validates date strings against specified formats with logical consistency checks.

Table of contents

  1. Signature
  2. Parameters
  3. Returns
  4. Description
  5. Examples
    1. Basic Usage
    2. Date Only
    3. Invalid Dates
    4. Invalid Times
    5. Leap Year Handling
  6. Common Format Patterns
  7. Use Cases
    1. Form Validation
    2. API Input Validation
    3. Data Import Validation
  8. Edge Cases
  9. Related Methods

Signature

public static function isValidDate(string $date, string $format = 'Y-m-d H:i:s'): bool

Parameters

Parameter Type Default Description
$date string - The date string to validate
$format string 'Y-m-d H:i:s' The expected date format (PHP date format)

Returns

bool - true if the date is valid, false otherwise.


Description

The isValidDate() method provides comprehensive date validation beyond simple format checking. It validates:

  1. Format conformance - Date matches the specified format pattern
  2. Logical date validity - Day exists in month (e.g., no February 30th)
  3. Time component validity:
    • Hours: 0-23
    • Minutes: 0-59
    • Seconds: 0-59

This prevents accepting dates like 2023-02-30 or 2023-12-25 25:00:00 that would be accepted by loose parsing.


Examples

Basic Usage

use MarjovanLier\StringManipulation\StringManipulation;

$isValid = StringManipulation::isValidDate('2023-12-25 12:30:00');
echo $isValid ? 'Valid' : 'Invalid'; // Output: Valid

Date Only

StringManipulation::isValidDate('2023-12-25', 'Y-m-d');
// Result: true

StringManipulation::isValidDate('25-12-2023', 'd-m-Y');
// Result: true

StringManipulation::isValidDate('12/25/2023', 'm/d/Y');
// Result: true

Invalid Dates

// February 30th doesn't exist
StringManipulation::isValidDate('2023-02-30', 'Y-m-d');
// Result: false

// Month 13 doesn't exist
StringManipulation::isValidDate('2023-13-01', 'Y-m-d');
// Result: false

// Day 32 doesn't exist
StringManipulation::isValidDate('2023-01-32', 'Y-m-d');
// Result: false

Invalid Times

// Hour 25 doesn't exist
StringManipulation::isValidDate('2023-12-25 25:00:00');
// Result: false

// Minute 60 doesn't exist
StringManipulation::isValidDate('2023-12-25 12:60:00');
// Result: false

// Second 60 doesn't exist
StringManipulation::isValidDate('2023-12-25 12:30:60');
// Result: false

Leap Year Handling

// 2024 is a leap year
StringManipulation::isValidDate('2024-02-29', 'Y-m-d');
// Result: true

// 2023 is not a leap year
StringManipulation::isValidDate('2023-02-29', 'Y-m-d');
// Result: false

Common Format Patterns

Format Example Description
Y-m-d H:i:s 2023-12-25 12:30:00 Full datetime (default)
Y-m-d 2023-12-25 Date only
d-m-Y 25-12-2023 European date format
m/d/Y 12/25/2023 US date format
Y-m-d H:i 2023-12-25 12:30 Datetime without seconds
d/m/Y H:i:s 25/12/2023 12:30:00 European datetime

Use Cases

Form Validation

class DateValidator
{
    public function validateBirthDate(string $date): bool
    {
        if (!StringManipulation::isValidDate($date, 'Y-m-d')) {
            return false;
        }

        // Additional business rules
        $birthDate = new DateTime($date);
        $now = new DateTime();

        return $birthDate < $now;
    }
}

API Input Validation

function validateEventRequest(array $request): array
{
    $errors = [];

    if (!StringManipulation::isValidDate($request['start_date'] ?? '')) {
        $errors[] = 'Invalid start date format';
    }

    if (!StringManipulation::isValidDate($request['end_date'] ?? '')) {
        $errors[] = 'Invalid end date format';
    }

    return $errors;
}

Data Import Validation

function validateImportRow(array $row, int $lineNumber): array
{
    $errors = [];

    // Try multiple date formats
    $formats = ['Y-m-d', 'd-m-Y', 'm/d/Y'];
    $dateValid = false;

    foreach ($formats as $format) {
        if (StringManipulation::isValidDate($row['date'], $format)) {
            $dateValid = true;
            break;
        }
    }

    if (!$dateValid) {
        $errors[] = "Line {$lineNumber}: Invalid date format";
    }

    return $errors;
}

Edge Cases

// Empty string
StringManipulation::isValidDate('', 'Y-m-d');
// Result: false

// Wrong format
StringManipulation::isValidDate('2023-12-25', 'd-m-Y');
// Result: false (format mismatch)

// Partial match
StringManipulation::isValidDate('2023-12', 'Y-m-d');
// Result: false

This method is standalone but often used alongside:

  • searchWords() - For normalising date-containing text
  • trim() - For cleaning input before validation

Back to top

Copyright © 2024 Marjo Wenzel van Lier. Distributed under the MIT License.