A point in the ocean has a timezone
GET /timezone?lat=&lon= returns the IANA zone at that point. Open ocean answers nautical Etc/GMT time, and the plus sign in the id means minus.
Open ocean has a timezone. The plus sign means minus.
GET /timezone?lat=30&lon=-40
{
"latitude": 30,
"longitude": -40,
"timezone": "Etc/GMT+3",
"name": "GMT-03:00",
"abbreviation": "GMT-3",
"offset": "-03:00",
"offset_minutes": -180,
"dst": false,
"next_dst": null
}
Land returns a civil zone, America/New_York at 40.71, -74.01. Past territorial waters the clock is nautical time, 15 degree longitude bands, encoded in the tz database as Etc/GMT ids. Etc/GMT+3 is UTC minus three. That inverted sign is POSIX, baked into the id itself. offset and name read the normal way, -03:00 and GMT-03:00. No DST out there, so next_dst is null.
Same bag as an IANA id
Pass a point or pass America/New_York. You get timezone, offset, abbreviation, whether DST is on, and the next clock change. ?at= pins any instant. The ocean is not a special case in the JSON, it is just a different id.
Try it
Call /timezone with lat=30&lon=-40. Feed Etc/GMT+3 to any date library. It already knows the sign is backwards.