```json
//[doc-seo]
{
"Description": "Format dates and handle clock-aware timezone conversion in ABP Angular applications with pipes, TimeService, and TimezoneService."
}
```
{%{
# Date and Time
ABP Angular provides culture-aware format pipes, clock-aware UTC conversion, timezone selection, and date-time services. These APIs use the culture, clock, and timezone values from the application configuration.
## Culture-Aware Format Pipes
Angular's built-in `DatePipe` can format a date directly:
```html
{{ today | date:'dd/MM/yy' }}
```
The ABP pipes below use the short date and time patterns returned in the application localization configuration.
### `shortDate`
```html
{{ today | shortDate }}
```
### `shortTime`
```html
{{ today | shortTime }}
```
### `shortDateTime`
```html
{{ today | shortDateTime }}
```
These pipes extend Angular's `DatePipe`. They select the format pattern from `ConfigStateService`; they do not apply ABP's clock-aware timezone selection. Use `abpUtcToLocal` when the value also needs to follow the application's clock and timezone.
## Clock-Aware UTC Conversion
The `abpUtcToLocal` pipe accepts `date`, `time`, or `datetime` as its format type:
```html
{{ order.creationTime | abpUtcToLocal:'datetime' }}
```
Its behavior depends on the clock configuration returned by the backend:
- With the UTC clock enabled, it converts the input to `TimezoneService.timezone`, including the daylight-saving-time offset for that date.
- With a non-UTC clock, it formats the value without applying the configured timezone conversion.
- Empty or invalid input produces an empty string.
The output pattern is still taken from the current application's short date and time formats.
## `TimezoneService`
Inject `TimezoneService` to read or persist the timezone used by the Angular application:
```ts
import { TimezoneService } from '@abp/ng.core';
import { Component, inject } from '@angular/core';
@Component({
selector: 'app-timezone-selector',
template: ``,
})
export class TimezoneSelectorComponent {
private readonly timezoneService = inject(TimezoneService);
selectTimezone(): void {
this.timezoneService.setTimezone('Europe/Istanbul');
}
}
```
`timezone` returns:
- the browser timezone when the backend clock is not UTC;
- the `Abp.Timing.TimeZone` setting when the clock is UTC and the setting has a value;
- the browser timezone as a fallback when the UTC setting is empty.
`setTimezone` writes the selected IANA timezone to the `__timezone` cookie only when the UTC clock is enabled.
When you configure the application with `provideAbpCore`, its built-in `timezoneInterceptor` adds the effective timezone to outgoing `HttpClient` requests as the `__timezone` header. It does not add the header when the UTC clock is disabled.
## `TimeService`
`TimeService` returns [Luxon](https://moment.github.io/luxon/#/) `DateTime` values and formats dates with the current Angular locale:
```ts
import { TimeService } from '@abp/ng.core';
import { inject, Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class ScheduleFormatter {
private readonly timeService = inject(TimeService);
formatForIstanbul(value: string): string {
return this.timeService.format(value, 'ff', 'Europe/Istanbul');
}
}
```
| Method | Behavior |
| --- | --- |
| `now(zone = 'local')` | Returns the current time in the requested IANA timezone. |
| `toZone(value, zone)` | Parses an ISO string or `Date` and returns a Luxon value in the requested timezone. |
| `format(value, format = 'ff', zone = 'local')` | Converts to the timezone, applies its DST rules, and formats with the current locale. |
| `formatDateWithStandardOffset(value, format = 'ff', zone?)` | Applies the zone's January 1 offset and formats without any further timezone or DST conversion. |
| `formatWithoutTimeZone(value, format = 'ff')` | Formats the parsed ISO clock fields without shifting them to another timezone. |
}%}