Formattazione ed analisi di dateTimes come stringhe

Questa sezione fornisce informazioni relative al modo in cui è possibile specificare il formato dateTime utilizzando una stringa di lettere di modello.

Quando si converte una data o un ora in una stringa, è necessario applicare un modello di formato per indirizzare la conversione. Applicare il modello di formato per convertire una data o un'ora in una stringa o per analizzare una stringa in una data o un ora.

Durante la conversione (ad esempio, di un valore data/ora in una stringa), un modello o una serie di token verranno sostituiti con l'origine equivalente. Il diagramma seguente mostra il modo in cui un modello viene utilizzato per formattare una origine data/ora per produrre un output di stringa di carattere.

Questo diagramma mostra la stringa di output che risulta da un'origine dateTime e un pattern di formato.

Quando una stringa viene analizzata (ad esempio, quando si converte la stringa in un valore data/ora) il modello o la serie di token viene utilizzata per determinare quale parte del valore data/ora di destinazione verrà rappresentata da una parte della stringa. Il diagramma seguente mostra il modo i cui viene eseguita questa operazione.

Questo diagramma mostra l'output dateTime che risulta da un'origine dati stringa e un pattern di formato.

Sintassi

Il modello di espressione viene definito con la modalità riportata di seguito:

Leggi diagramma di sintassiIgnora diagramma di sintassi visivosymbolstring
dove:
simbolo
è un carattere nella serie adDeEFGhHIkKmMsSTUwWyYzZ.
stringa
è una sequenza di caratteri compresa in apici. Se in una stringa è richiesta un apice singolo, utilizzare due apici singoli (").

Caratteri di formattazione di una data/ora come stringa

Nella tabella seguente sono elencati i caratteri che è possibile utilizzare in un modello per la formattazione o l'analisi delle stringhe in relazione a un valore data/ora. Dopo la tabella vengono fornite alcune note che illustrano alcuni degli esempi nella tabella.

Simbolo Significato Presentazione Esempi
a indicatore am o pm Testo am di input, AM, pm, PM. AM o PM di output.
d giorno del mese (1-31) Numero 1, 20
gg giorno del mese (01-31) Numero 01, 31
D giorno dell'anno (1-366) Numero 3, 80, 100
GG giorno dell'anno (01-366) Numero 03, 80, 366
GGG giorno dell'anno (001-366) Numero 003
e giorno della settimana (1-7)1 Numero 2
GGG giorno della settimana1 Testo Mar
EEE giorno della settimana1 Testo Martedì
F giorno settimanale del mese (1-5)2 Numero 2
G Era Testo AC o DC
h ora in am o pm (1-12) Numero 6
hh ora in am o pm (01-12) Numero 06
H ora del giorno nel formato di 24 ore (0-23)3 Numero 7
OO ora del giorno nel formato di 24 ore (00-23)3 Numero 07
I ISO8601 data/ora (fino a yyyy-MM-dd'T'HH:mm:ss. SSSZZZ)4 Testo 2006-10-07T12:06:56.568+01:00
IU ISO8601 Data/ora (simile I, ma ZZZ con l'output "Z" se il fuso orario è +00:00)4 Testo 2006-10-07T12:06:56.568+01:00, 2003-12 -15T15:42:12.000Z
k ora del giorno in formato di 24 ore (1-24)3 Numero 8
kk ora del giorno in formato di 24 ore (01-24)3 Numero 08
K ora in am o pm (0-11) Numero 9
KK ora in am o pm (00-11) Numero 09
m minuto Numero 4
mm minuto Numero 04
M mese in formato numerico Numero 5, 12
MI mese in formato numerico Numero 05, 12
MMM mese in formato nome Testo Gen, feb
MMM mese in formato nome Testo Gennaio, febbraio
s secondi10 Numero 5
ss secondi10 Numero 05
S decimi di secondo5 Numero 7
SS centesimi di secondo5 Numero 70
SSS millesimi di secondo5 Numero 700
SSSS 0,0001 secondi5 Numero 7000
SSSSS 0,00001 secondi5 Numero 70000
SSSSSS 0,000001 secondi5 Numero 700000
T ISO8601 Ora (fino a HH:mm:ss.SSSZZZ)4 Testo 12:06:56.568+01:00
TU ISO8601 Ora (simile a T, ma un fuso orario di +00:00 è sostituito da 'Z')4 Testo 12:06:56.568+01:00, 15:42:12.000Z
w settimana nell'anno6 Numero 7, 53
ww settimana nell'anno6 Numero 07, 53
W settimana del mese7 Numero 2
aa anno8 Numero 06
aaaa anno8 Numero 2006
AA anno: utilizzare solo con settimana dell'anno6 Numero 06
AAAA anno: utilizzare solo con settimana dell'anno6 Numero 2006
zzz fuso orario (abbreviazione)9 Testo EST
zzzz fuso orario (nome completo) Testo Ora solare fuso Orientale
Z fuso orario (+/-n) Testo +3
IT fuso orario (+/-nn) Testo +03
ZZZ fuso orario (+/-nn:nn) Testo +03:00
ZZZU fuso orario (come per ZZZ, ma "+00:00" è sostituito da "Z") Testo +03:00, Z
ZZZZ fuso orario (GMT+/-nn:nn) Testo GMT+03:00
ZZZZZ fuso orario (come per ZZZ, ma senza virgola) (+/-nnnn) Testo +0300
' testo in sequenza Escape   'Testo utente'
" (due virgolette singole) una virgoletta singola tra testo con carattere di escape   'ora precisa'

La presentazione dell'oggetto data/ora dipende dai simboli specificati.

  • Testo. Se si specificano quattro o più simboli, viene visualizzato il formato completo. Se vengono specificati meno di quattro simboli, viene presentata la forma abbreviata o ridotta, se esiste. Ad esempio, EEEE produce Monday, EEE produce Mon.
  • Numero. Il numero di caratteri per un componente dateTime numerico deve essere nei limiti dei simboli di formattazione corrispondenti. Ripetere il simbolo per specificare il numero minimo di cifre richieste. Il numero massimo di cifre consentite sarà il limite massimo per un determinato simbolo. Ad esempio, day in month ha un limite superiore di 31; pertanto, una stringa di formato d consente l'analisi dei valori 2 o 21, ma non consente i valori 32 e 210. Nell'output, vengono aggiunti degli zero fino alla lunghezza specificata. Per l'anno, fare riferimento alla nota 8 nell'elenco seguente, poiché rappresenta un caso speciale. Per le frazioni di secondo, fare riferimento alla nota 5 nel seguente elenco.
  • Tutti i caratteri nel modello non compresi tra ['a'..'z'] e ['A'..'Z'] sono considerati come testo tra apici. Ad esempio, i caratteri come i due punti (:), la virgola (,), il punto (.), il cancelletto (#), la chiocciola (@) e lo spazio vengono visualizzati nel testo risultante anche se non sono racchiusi tra apici.
  • È possibile creare stringhe formato con risultati non previsti ed è pertanto necessario prestare la massima attenzione durante l'utilizzo dei simboli. Ad esempio, se si specifica dMyyyy, è impossibile distinguere tra il giorno, il mese e l'anno. dMyyyy indica al nodo di integrazione che un minimo di un carattere rappresenta il giorno, un minimo di un carattere rappresenta il mese e quattro caratteri rappresentano l'anno. Di conseguenza, 3111999 può essere interpretato come 3/11/1999 o come 31/1/1999.
Note: le seguenti note si applicano alla tabella precedente.
  1. È possibile specificare i seguenti valori nel campo day in week :
    • 1 - Domenica
    • 2 - Lunedì
    • 3 - Martedì
    • 4 - Mercoledì
    • 5 - Giovedì
    • 6 - Venerdì
    • 7 - Sabato
  2. il 12 luglio 2006 è il secondo mercoledì di luglio e può essere espresso come 2006 July Wednesday 2 utilizzando la stringa di formato yyyy MMMM EEEE F. Si noti che questo formato non rappresenta il mercoledì della seconda settimana di luglio 2006, che è il 5 luglio 2006; la stringa di formato per questo è yyyy MMMM EEEE W.
  3. È possibile che nei campi relativi al formato 24 ore risulti un'ora ambigua se viene specificata con un campo am/pm conflittuale.
  4. Vedere ISO8601, I e T DateTime token.
  5. I secondi frazionari sono rappresentati da S. maiuscolo La lunghezza deve corrispondere implicitamente al numero di simboli di formato sull'input. Le stringhe di formato ss SSS o ss.SSS, ad esempio, rappresentano secondi e millesimi di secondo. Tuttavia, la stringa di formato ss.sss rappresenta un campo ripetuto (di secondi); il valore dopo il punto (.) è preso come un campo secondi, non come secondi frazionari. L'output è troncato alla lunghezza specificata.
  6. In ESQL, il primo giorno dell'anno è considerato essere nella prima settimana, per cui il giorno 1 gennaio è sempre nella settimana 1. Di conseguenza, le date specificate relative a un anno potrebbero essere in un anno diverso. Ad esempio, "Lunedì settimana 1 2005" analizzato utilizzando "EEEE' week 'w' 'YYYY" fornisce una data 2004-12-27, perché il lunedì della prima settimana del 2005 è una data del 2004.

    Se si utilizza il simbolo y, l'aggiustamento non viene eseguito e si potrebbero verificare risultati imprevedibili per le date nella parte finale dell'anno. Ad esempio, se la stringa "2005 01 Lunedì" ha il formato:

    • Il lunedì della settimana 1 del 2005, utilizzando la stringa di formato "YYYY ww EEEE", viene interpretato correttamente come 27 dicembre 2004
    • Il lunedì della settimana 1 del 2005 utilizzando la stringa di formato "yyyy ww EEEE" viene interpretato erroneamente come 27 dicembre 2005
  7. È possibile che la prima e l'ultima settimana di un mese includano giorni del mese successivo o precedente. Ad esempio, lunedì 31 luglio 2006 può essere espresso come lunedì della prima settimana di agosto 2006, ovvero 2006 08 1 Monday utilizzando la stringa di formato yyyy MM W EEEE.
  8. L'anno è considerato un caso speciale.
    • Nell'output, se il conteggio di y è 2, l'anno è troncato a 2 cifre. Ad esempio, se con yyyy viene prodotto 1997, con yy viene prodotto 97.
    • Nell'input, per gli anni composti da 2 cifre, la Finestra secolo è fissata su 53. Ad esempio, la data di input 52 ha come risultato il valore dell'anno 2052, mentre 53 fornisce l'anno di output 1953 e 97 restituisce 1997.
  9. Utilizzando l'opzione zzz è possibile che si ottengano risultati ambigui. Ad esempio, BST può essere interpretato come Bangladesh Standard Time o British Summer Time. Per motivi di compatibilità, IBM® Integration Bus utilizza la precedente interpretazione.

    Per evitare il problema, utilizzare l'opzione zzzz con un nome ben definito quale, ad esempio, Europa/Londra, Asia/Dacca o America/Los_Angeles.

  10. I secondi s & ssdevono essere compresi nell'intervallo 0-59. Se è necessario creare un TIMESTAMP che rappresenti l'ora durante un secondo bisestile, in cui il valore creato o il cast utilizza il valore 60 per secondi, è necessario gestire questo caso all'interno del codice ESQL. Le funzioni CURRENT_ datetime (ad esempio, CURRENT_TIME) all'interno del prodotto non producono mai un tempo in cui il valore dei secondi non rientra nell'intervallo compreso tra 0 e 59.

ISO8601, token I e T data/ora

Se i valori data/ora sono compatibili con lo standard ISO8601:2000 'Rappresentazione di date e ore', valutare la possibilità di utilizzare i simboli di formattazione I e T, che corrispondono alla serie secondaria dello standard ISO8601.

  • Il profilo limitato come proposto da W3C all'indirizzo http://www.w3.org/TR/NOTE-datetime
  • Le rappresentazioni troncate delle date del calendario, come specificato nella sezione 5.2.1.3 di ISO8601:2000
    • Formato di base (sottosezioni c, e ed f)
    • Formato esteso (sottosezioni a, b e d)

Utilizzare i simboli di formattazione I e T solo da soli:

  • Il simbolo di formattazione I corrisponde a una stringa data/ora qualsiasi in conformità con la serie secondaria supportata.
  • Il simbolo di formattazione T corrisponde a qualsiasi stringa data/ora che sia conforme alla serie secondaria supportata formata solo da una parte relativa all'ora.

La tabella seguente mostra il modo in cui il formato di output è in relazione con il tipo dati logici.

Tipo dati del modello logico tipo dati ESQL Modulo di output
xsd:dateTime TIMESTAMP o GMTTIMESTAMP aaaa-MM-dd'T'HH:mm:ss.SSSZZZ
xsd:date DATA aaaa-MM-gg
xsd:gYear INTERVALLO aaaa
xsd:gYearMonth INTERVALLO aaaa-MM
xsd:gMonth INTERVALLO --MM
xsd:gmonthDay INTERVALLO --MM-dd
xsd:gDay INTERVALLO ---dd
xsd:time TIME / GMTTIME 'T'HH:mm:ss.SSSZZZ
Nota:
  • Nell'input, entrambi I e T accettano sia '+00:00' che 'Z' per indicare una differenza oraria pari a zero dal fuso orario UTC (Coordinated Universal Time), ma nell'output verrà sempre generato il valore '+00:00'. Per consentire sempre la creazione di 'Z' all'output, utilizzare i simboli di formattazione IU o TU.
  • Il valore ZZZ viene riportato sempre con '+00:00', per indicare una differenza oraria pari a zero dal fuso orario UTC (Coordinated Universal Time). Per consentire sempre la creazione di 'Z' all'output, utilizzare invece ZZZU.

Utilizzo del formato UTC di input nell'output

Un elemento o un attributo di tipo logico xsd:dateTime o xsd:time che contiene un valore dateTime sotto forma di stringa può specificare il valore UTC utilizzano il simbolo Z o il fuso orario +00:00. Nell'input nel programma di analisi MRM è memorizzato il formato UTC di tali elementi e attributi. Nell'output, è possibile specificare se visualizzare Z o +00:00 utilizzando la proprietà Formato data/ora predefinito dell'elemento o dell'attributo. In alternativa, è possibile mantenere il formato UTC di input selezionando la proprietà della serie di messaggi Utilizza il formato UTC di input nell'output. Se questa proprietà è selezionata, il formato UTC viene mantenuto nel messaggio di output e sovrascrive il formato specificato dalla proprietà del formato data/ora.

Introduzione alla funzione CAST e a DST (daylight saving time)

Quando il nodo di integrazione è in esecuzione in un fuso orario diverso da GMT, calcola l'offset DST (daylight saving time) sugli orari forniti dalla funzione CAST. Affinché CAST possa calcolare correttamente l'offset, è necessario associare un fuso orario all'ora inoltrata a CAST, come parametro Z. Se non viene associato alcun fuso orario al valore inoltrato, l'ora viene convertita in ora GMT e non viene considerata un'ora locale.

Inoltre, quando si utilizza CAST per eseguire il casting di una stringa in un valore temporale, l'offset DST viene calcolato utilizzando la data di sistema corrente. Per eseguire il casting di una stringa in una variabile temporale e calcolare il DST per una specifica data, è necessario specificare tale data.

Ad esempio, se timeValue='10:00:00', il seguente codice, eseguito su un nodo di integrazione che si trova nel fuso orario legale centrale, converte l'ora in GMT, poiché non è specificato alcun identificatore di fuso orario:
DECLARE castTime TIME;
SET castTime = CAST (timeValue AS TIME FORMAT timePattern)
L'ora non viene convertita nuovamente in GMT se si utilizza la variabile castTime in qualsiasi codice successivo, ad esempio:
CAST(castDate, castTime AS GMTTIMESTAMP);

Esempi

La tabella seguente mostra alcuni esempi dei formati data/ora.

Modello di formato Risultato
"aaaa.MM.dd 'a' HH:mm:ss ZZZ" 2006.07.10 a 15:08:56 -05:00
"EEE, MMM d, "yy" Mer, 10 luglio '06
"h:mm a" 20:08
"hh o"clock a, ZZZZ" 09:00, GMT+09:00
"K:mm a, ZZZ" 9:34, -05:00
"aaaa.MMMMM.dd hh:mm aaa" 10.luglio.1996 12:08

Utilizzo all'interno di un dominio MRM

In MRM è possibile definire un elemento con il tipo logico dateTime.

Durante l'analisi di un elemento dateTime (data/ora), viene creato un campo nella struttura ad albero dei messaggi con il tipo di dati ESQL CURRENT_TIME o CURRENT_TIMESTAMP. Tuttavia, i tipi di dati CURRENT_TIME e CURRENT_TIMESTAMP non dispongono della funzionalità per memorizzare le informazioni sul fuso orario e l'MRM non regola l'ora in base al fuso orario di input e al fuso orario del nodo di integrazione.

Benché i tipi di dati CURRENT_TIME e CURRENT_TIMESTAMP non possano memorizzare informazioni sul fuso orario, MRM memorizza queste informazioni come parte del campo sottostante. Ciò significa che se il campo viene copiato da una strutture ad albero dei messaggi ad un'altra, vengono copiate anche le informazioni sul fuso orario, consentendo la conservazione delle informazioni nell'output.

Notare che le informazioni vengono mantenute solo se il campo viene copiato in un campo omonimo.

Tuttavia, se il nuovo campo viene derivato da quello originale, perde le informazioni sul fuso orario. Ciò significa che se tale campo viene interpretato come un carattere, il nuovo campo assume il fuso orario del nodo di integrazione, ma il suo valore non viene regolato per alcuna differenza tra il fuso orario di input e il fuso orario del nodo di integrazione.

Ad esempio, un elemento dateTime di input contenente 2009-02-20T06:08:07-08:00 potrebbe essere copiato dalla struttura ad albero dei messaggi di input a quella di output ed essere visualizzata in messaggio di output con lo stesso identico formato. Tuttavia, se l'elemento viene interpretato come carattere, utilizzando il formato IU, da un nodo di integrazione che esegue GMT, il risultato sarà 2009-02-20T06:08:07.000Z.