or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

branded-types-validation.mdcollection-codecs.mddate-handling.mdfunctional-programming-types.mdindex.mdjson-handling.mdstring-number-transformations.mdutility-functions-codec-modifiers.md
tile.json

date-handling.mddocs/

0

# Date Handling

1

2

Codecs for parsing and encoding dates from various formats including ISO strings, Unix timestamps, and millisecond timestamps. These codecs handle the common date representation formats used in APIs and data storage.

3

4

## Capabilities

5

6

### DateFromISOString

7

8

Converts ISO date strings to Date objects and vice versa, handling the standard ISO 8601 format commonly used in APIs.

9

10

```typescript { .api }

11

/**

12

* Codec that parses ISO date strings to Date objects

13

* Handles ISO 8601 format and encodes Date objects back to ISO strings

14

*/

15

interface DateFromISOStringC extends t.Type<Date, string, unknown> {}

16

const DateFromISOString: DateFromISOStringC;

17

```

18

19

**Usage Examples:**

20

21

```typescript

22

import { DateFromISOString } from "io-ts-types";

23

24

const result1 = DateFromISOString.decode("2023-12-25T10:30:00.000Z");

25

// Right(Date object representing December 25, 2023 at 10:30 AM UTC)

26

27

const result2 = DateFromISOString.decode("2023-12-25T10:30:00Z");

28

// Right(Date object) - also accepts without milliseconds

29

30

const result3 = DateFromISOString.decode("invalid-date");

31

// Left([ValidationError])

32

33

const result4 = DateFromISOString.decode("");

34

// Left([ValidationError])

35

36

// Encoding Date back to ISO string

37

const date = new Date("2023-12-25T10:30:00.000Z");

38

const encoded = DateFromISOString.encode(date);

39

// "2023-12-25T10:30:00.000Z"

40

```

41

42

### DateFromNumber

43

44

Converts millisecond timestamps (numbers) to Date objects, commonly used for JavaScript timestamp representations.

45

46

```typescript { .api }

47

/**

48

* Codec that converts millisecond timestamps to Date objects

49

* Handles JavaScript Date.getTime() format (milliseconds since epoch)

50

*/

51

interface DateFromNumberC extends t.Type<Date, number, unknown> {}

52

const DateFromNumber: DateFromNumberC;

53

```

54

55

**Usage Examples:**

56

57

```typescript

58

import { DateFromNumber } from "io-ts-types";

59

60

const result1 = DateFromNumber.decode(1703505000000);

61

// Right(Date object representing December 25, 2023 at 10:30 AM UTC)

62

63

const result2 = DateFromNumber.decode(0);

64

// Right(Date object representing January 1, 1970 UTC)

65

66

const result3 = DateFromNumber.decode(-1);

67

// Right(Date object representing December 31, 1969 UTC)

68

69

// Encoding Date back to millisecond timestamp

70

const date = new Date("2023-12-25T10:30:00.000Z");

71

const encoded = DateFromNumber.encode(date);

72

// 1703505000000

73

```

74

75

### DateFromUnixTime

76

77

Converts Unix timestamps (seconds since epoch) to Date objects, commonly used in Unix systems and many APIs.

78

79

```typescript { .api }

80

/**

81

* Codec that converts Unix timestamps to Date objects

82

* Handles seconds since Unix epoch (January 1, 1970 UTC)

83

*/

84

interface DateFromUnixTimeC extends t.Type<Date, number, unknown> {}

85

const DateFromUnixTime: DateFromUnixTimeC;

86

```

87

88

**Usage Examples:**

89

90

```typescript

91

import { DateFromUnixTime } from "io-ts-types";

92

93

const result1 = DateFromUnixTime.decode(1703505000);

94

// Right(Date object representing December 25, 2023 at 10:30 AM UTC)

95

96

const result2 = DateFromUnixTime.decode(0);

97

// Right(Date object representing January 1, 1970 UTC)

98

99

const result3 = DateFromUnixTime.decode(-1);

100

// Right(Date object representing December 31, 1969 UTC)

101

102

// Encoding Date back to Unix timestamp

103

const date = new Date("2023-12-25T10:30:00.000Z");

104

const encoded = DateFromUnixTime.encode(date);

105

// 1703505000

106

```

107

108

### Date Validation

109

110

Validates values are Date instances using instanceof check, useful for runtime validation of Date objects.

111

112

```typescript { .api }

113

/**

114

* Codec that validates values are Date instances

115

* Uses instanceof check for runtime Date validation

116

*/

117

interface DateC extends t.Type<Date, Date, unknown> {}

118

const date: DateC;

119

```

120

121

**Usage Examples:**

122

123

```typescript

124

import { date } from "io-ts-types";

125

126

const result1 = date.decode(new Date());

127

// Right(Date object)

128

129

const result2 = date.decode("2023-12-25");

130

// Left([ValidationError]) - string is not a Date instance

131

132

const result3 = date.decode(1703505000000);

133

// Left([ValidationError]) - number is not a Date instance

134

135

// Identity encoding (Date -> Date)

136

const dateObj = new Date();

137

const encoded = date.encode(dateObj);

138

// Same Date object

139

```

140

141

## Common Usage Patterns

142

143

### API Response with Mixed Date Formats

144

145

```typescript

146

import * as t from "io-ts";

147

import { DateFromISOString, DateFromUnixTime } from "io-ts-types";

148

149

const Event = t.type({

150

id: t.number,

151

title: t.string,

152

createdAt: DateFromISOString, // ISO format from modern APIs

153

scheduledAt: DateFromUnixTime, // Unix timestamp from legacy systems

154

updatedAt: DateFromISOString

155

});

156

157

const eventData = {

158

id: 1,

159

title: "Team Meeting",

160

createdAt: "2023-12-25T10:30:00.000Z",

161

scheduledAt: 1703505000, // Unix timestamp

162

updatedAt: "2023-12-25T11:00:00.000Z"

163

};

164

165

const parsed = Event.decode(eventData);

166

// Right({

167

// id: 1,

168

// title: "Team Meeting",

169

// createdAt: Date,

170

// scheduledAt: Date,

171

// updatedAt: Date

172

// })

173

```

174

175

### Database Record Processing

176

177

```typescript

178

import * as t from "io-ts";

179

import { DateFromNumber, DateFromISOString } from "io-ts-types";

180

181

const DatabaseRecord = t.type({

182

id: t.string,

183

created_at: DateFromNumber, // Stored as millisecond timestamp

184

expires_at: DateFromISOString, // Stored as ISO string

185

data: t.record(t.string, t.unknown)

186

});

187

188

const record = {

189

id: "user_123",

190

created_at: 1703505000000,

191

expires_at: "2024-01-25T10:30:00.000Z",

192

data: { preferences: { theme: "dark" } }

193

};

194

195

const parsed = DatabaseRecord.decode(record);

196

// Converts timestamps to proper Date objects

197

```

198

199

### Form Input Processing

200

201

```typescript

202

import * as t from "io-ts";

203

import { DateFromISOString } from "io-ts-types";

204

205

const EventForm = t.type({

206

title: t.string,

207

startDate: DateFromISOString, // HTML date input provides ISO string

208

endDate: DateFromISOString,

209

description: t.string

210

});

211

212

// HTML form data (date inputs return ISO strings)

213

const formData = {

214

title: "Conference",

215

startDate: "2024-06-15T09:00:00.000Z",

216

endDate: "2024-06-15T17:00:00.000Z",

217

description: "Annual tech conference"

218

};

219

220

const validated = EventForm.decode(formData);

221

// Right({ title: "Conference", startDate: Date, endDate: Date, description: "..." })

222

```

223

224

### Time Zone Handling

225

226

```typescript

227

import { DateFromISOString, DateFromUnixTime } from "io-ts-types";

228

229

// Unix timestamps are always UTC

230

const utcTime = DateFromUnixTime.decode(1703505000);

231

// Right(Date representing UTC time)

232

233

// ISO strings can include timezone information

234

const isoWithTz = DateFromISOString.decode("2023-12-25T10:30:00+02:00");

235

// Right(Date object automatically adjusted to local timezone)

236

237

const isoUtc = DateFromISOString.decode("2023-12-25T10:30:00.000Z");

238

// Right(Date object in UTC)

239

```

240

241

### Date Arithmetic and Comparison

242

243

```typescript

244

import * as t from "io-ts-types";

245

import { DateFromISOString } from "io-ts-types";

246

247

const DateRange = t.type({

248

start: DateFromISOString,

249

end: DateFromISOString

250

});

251

252

const range = {

253

start: "2023-12-25T10:00:00.000Z",

254

end: "2023-12-25T18:00:00.000Z"

255

};

256

257

const decoded = DateRange.decode(range);

258

if (decoded._tag === "Right") {

259

const { start, end } = decoded.right;

260

const durationMs = end.getTime() - start.getTime();

261

const durationHours = durationMs / (1000 * 60 * 60);

262

console.log(`Duration: ${durationHours} hours`); // Duration: 8 hours

263

}

264

```