# Date/Time Format Standardization

## INT-008: Standardize date/time formats

**Date**: 2025-12-25  
**Status**: Completed

## Summary

All date and time values in Veza API responses now use ISO 8601 (RFC3339) format consistently.

## Standard Date/Time Format

All dates and timestamps use **ISO 8601 (RFC3339)** format:
- Format: `YYYY-MM-DDTHH:mm:ssZ` or `YYYY-MM-DDTHH:mm:ss.sssZ`
- Example: `2025-12-25T10:30:00Z` or `2025-12-25T10:30:00.123Z`
- Timezone: Always UTC (indicated by `Z` suffix)

## Implementation

### Backend

All date/time formatting is now standardized through:

1. **`time.RFC3339`** (Go standard library):
   - Used throughout the codebase for consistent formatting
   - Ensures ISO 8601 compliance
   - Always uses UTC timezone

2. **`utils.FormatISO8601`** (`internal/utils/datetime.go`):
   - Helper function for formatting `time.Time` to ISO 8601
   - Automatically converts to UTC
   - Used for manual date formatting

3. **`utils.FormatISO8601Ptr`** (`internal/utils/datetime.go`):
   - Helper for nullable `*time.Time` fields
   - Returns empty string if nil

4. **`utils.ParseISO8601`** (`internal/utils/datetime.go`):
   - Helper for parsing ISO 8601 strings
   - Used for date input validation

5. **Model Updates**:
   - `UserResponse.FromUser`: Uses `time.RFC3339` instead of custom format
   - All `time.Time` fields in models are automatically serialized by Go's JSON encoder
   - GORM models use `time.Time` which serializes correctly

### Frontend

The frontend already expects ISO 8601 format:
- JavaScript `Date` constructor parses ISO 8601 automatically
- All date parsing/formatting libraries support ISO 8601
- No frontend changes required

## Changes Made

### Backend Changes

1. **`internal/models/responses.go`**:
   - Updated `FromUser` to use `time.RFC3339` instead of `"2006-01-02T15:04:05Z"`
   - Added `time` import
   - Ensures UTC timezone with `.UTC()`

2. **`internal/handlers/webhook_handlers.go`**:
   - Updated webhook test timestamp to use `time.RFC3339`
   - Ensures consistent format in webhook payloads

3. **`internal/utils/datetime.go`** (new file):
   - Created helper functions for date formatting
   - `FormatISO8601`: Formats time.Time to ISO 8601
   - `FormatISO8601Ptr`: Formats nullable *time.Time
   - `ParseISO8601`: Parses ISO 8601 strings

4. **Error Responses**:
   - Already using `time.RFC3339` in `error_response.go`
   - No changes needed

### Model Serialization

GORM models with `time.Time` fields are automatically serialized correctly:
- Go's JSON encoder uses RFC3339 format by default for `time.Time`
- All model fields like `CreatedAt`, `UpdatedAt` are correctly formatted
- No additional changes needed for models

## Migration Notes

- All manual date formatting now uses `time.RFC3339`
- Custom format strings like `"2006-01-02T15:04:05Z"` replaced with `time.RFC3339`
- All timestamps are in UTC timezone
- Frontend automatically handles ISO 8601 format

## Files Modified

- `veza-backend-api/internal/models/responses.go`
- `veza-backend-api/internal/handlers/webhook_handlers.go`
- Created: `veza-backend-api/internal/utils/datetime.go`
- Created: `DATETIME_STANDARD.md` (this document)

## Next Steps

1. ✅ Standardize all date formatting to RFC3339
2. ✅ Create helper functions for date formatting
3. ✅ Update manual date formatting in responses
4. ✅ Verify model serialization
5. ⏳ Add integration tests for date format validation

