Patrick Savalle
Patrick Savalle

Reputation: 4426

What is the correct way to declare a date in an OpenAPI / Swagger-file?

What is the correct way to declare a date in a swagger-file object? I would think it is:

  startDate:
    type: string
    description: Start date
    example: "2017-01-01"
    format: date

But I see a lot of declarations like these:

  startDate:
    type: string
    description: Start date
    example: "2017-01-01"
    format: date
    pattern: "YYYY-MM-DD"
    minLength: 0
    maxLength: 10

Upvotes: 171

Views: 362823

Answers (6)

sendon1982
sendon1982

Reputation: 11234

An example of OpenAPI 3 is based on document here:

https://swagger.io/docs/specification/data-models/data-types/

An optional format modifier serves as a hint at the contents and format of the string. OpenAPI defines the following built-in string formats:

date – full-date notation as defined by RFC 3339, section 5.6, for example, 2017-07-21

date-time – the date-time notation as defined by RFC 3339, section 5.6, for example, 2017-07-21T17:32:28Z

BookingNoteRequest:
  type: object
  properties:
    note:
      type: string
    postedDate:
      type: string
      format: date
      example: '2022-07-01'
    postedTime:
      type: string
      format: date-time
      example: '2017-07-21T17:32:28Z'

If the date or date-time format does not follow the standard as defined by RFC 3339, then the format field should be removed and the pattern field added with a regular expression defining the format.

Upvotes: 16

Somesh Mahajan
Somesh Mahajan

Reputation: 266

In OpenAPI, the date-time format is used to define a string that represents a date and time according to the ISO 8601 standard. This format includes a full date and time in UTC, typically expressed as follows

YYYY-MM-DDThh:mm:ssZ

Here’s a breakdown:

  • YYYY = Four-digit year

  • MM = Two-digit month (01-12)

  • DD = Two-digit day of the month (01-31)

  • T = A separator between the date and time components

  • hh = Two-digit hour (00-23)

  • mm = Two-digit minutes (00-59)

  • ss = Two-digit seconds (00-59)

  • Z = UTC indicator ("Z" stands for Zulu time, another name for UTC)

Regex for this: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$

CODE


import (
    "fmt"
    "regexp"
)

func main() {
    // ISO 8601 `date-time` regex pattern
    iso8601Regex := `^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$`

    // Compile the regex
    r, _ := regexp.Compile(iso8601Regex)

    // Example date-time strings
    validDateTime := "2024-08-20T14:30:00Z"
    invalidDateTime := "2024-08-20 14:30:00"

    // Validate the strings
    fmt.Printf("Is '%s' valid? %t\n", validDateTime, r.MatchString(validDateTime))
    fmt.Printf("Is '%s' valid? %t\n", invalidDateTime, r.MatchString(invalidDateTime))
}

Upvotes: 0

Filipe Bezerra de Sousa
Filipe Bezerra de Sousa

Reputation: 3032

A correct example of declaring date in an Open API swagger file:

    properties:
      releaseDate:
        type: date
        pattern: /([0-9]{4})-(?:[0-9]{2})-([0-9]{2})/
        example: "2019-05-17"

Upvotes: 25

Pascal
Pascal

Reputation: 3155

The OpenAPI Specification says that you must use:

type: string
format: date # or date-time

The internet date/time standard used by OpenAPI is defined in RFC 3339, section 5.6 (effectively ISO 8601) and examples are provided in section 5.8. So for date values should look like "2018-03-20" and for date-time, "2018-03-20T09:12:28Z". As such, when using date or date-time, the pattern should be omitted.

If you need to support dates/times formatted in a way that differs to RFC 3339, you are not allowed to specify your parameter as format: date or format: date-time. Instead, you should specify type: string with an appropriate pattern and remove format.

Finally, note that a pattern of "YYYY-MM-DD" is invalid according to the specification: pattern must be a regular expression, not a placeholder or format string.

Upvotes: 299

amitsriv99
amitsriv99

Reputation: 143

For Swagger 2.0

 /room-availability:
    get:
      tags:
      - "realtime price & availability"
      summary: "Check realtime price & availability"
      description: "Check realtime price & availability"
      operationId: "getRealtimeQuote"
      produces:
      - "application/json"
      parameters:
      - in: "query"
        name: "checkInDate"
        description: "Check-in Date in DD-MM-YYYY format"
        type: "string"
        pattern: "^(3[01]|[12][0-9]|0[1-9])-(1[0-2]|0[1-9])-[0-9]{4}$"
      - in: "query"
        name: "numOfGuests"
        description: "Number of guests"
        type: "integer"
        format: "int16"
      - in: "query"
        name: "numOfNightsStay"
        description: "number of nights stay"
        type: "integer"
        format: "int16"
      - in: "query"
        name: "roomType"
        description: "Room type"
        type: "string"
        enum:
        - "King Size"
        - "Queen Size"
        - "Standard Room"
        - "Executive Suite"
      - in: "query"
        name: "hotelId"
        description: "Hotel Id"
        type: "string"

Upvotes: -1

Kriil
Kriil

Reputation: 578

pattern should be a regular expression. This is stated in the OpenAPI Specification.

pattern (This string SHOULD be a valid regular expression, according to the ECMA 262 regular expression dialect)

This is because OpenAPI objects are based off the JSON Schema specification.

OpenAPI 2.0: This object is based on the JSON Schema Specification Draft 4 and uses a predefined subset of it.

OpenAPI 3.0: This object is an extended subset of the JSON Schema Specification Wright Draft 00.

If a web service exposes a date or a date-time that doesn't conform to the Internet Date/Time Format described in RFC3339, then date and date-time are not valid values for the format field. The property must be defined as having a type equal to string without using format. Instead, pattern can be used to give a regular expression that defines the date or date-time pattern. This allows a client tool to automatically parse the date or date-time.

I also recommend putting the format in the description field so human consumers can read it more easily.

Upvotes: 10

Related Questions