OData v2: Edm.DateTime and Edm.DateTimeOffset payload serialization drops milliseconds

Aperta Adatta ai principianti
#7,035 1 commento 0 reazioni 1 assegnatario Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@sebxt ci sta già lavorando.

Dal 5/11/2026.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
76/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
typescript
Ambito
api, backend

Direzione di ricerca

Inizia da serializeFromMoment in packages/odata-v2/src/de-serializers/converters.ts e segui il modo in cui i serializer di Edm.DateTime e Edm.DateTimeOffset creano i valori /Date(...)/. Aggiungi test di regressione per timestamp con millisecondi, offset e timestamp negativi, quindi esegui i test pertinenti dei serializer OData v2. Il lavoro è completo quando la serializzazione conserva il valore completo in millisecondi dall’epoca in tutti e tre i casi.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug
Describe the Bug

The default OData v2 serializer for Edm.DateTime and Edm.DateTimeOffset truncates the value to whole seconds. A moment with a millisecond part is sent with 000 milliseconds in create and update payloads, so the backend stores a different value than the one the application set.

Reading a value and writing it back is also lossy: /Date(1556630382123)/ is deserialized correctly, but serialized as /Date(1556630382000)/. For timestamps before 1970 the value is additionally rounded down to the previous second, e.g. moment(-1500) becomes /Date(-2000)/.

URI serialization (filters, keys) is not affected, it uses toISOString() and keeps the milliseconds.

Steps to Reproduce
import moment from 'moment';
import { defaultDeSerializers } from '@sap-cloud-sdk/odata-v2';

const { serialize, deserialize } = defaultDeSerializers['Edm.DateTime'];

serialize(moment(1556630382123));
// '/Date(1556630382000)/'

serialize(deserialize('/Date(1556630382123+0120)/'));
// '/Date(1556630382000+0120)/'

serialize(moment(-1500));
// '/Date(-2000)/'
Expected Behavior

/Date(1556630382123)/, /Date(1556630382123+0120)/ and /Date(-1500)/. The /Date(...)/ format carries milliseconds since the epoch, and the deserializer already keeps them.

Used Versions

@sap-cloud-sdk/odata-v2 4.9.1 (current main).

Additional Context

Root cause is serializeFromMoment in packages/odata-v2/src/de-serializers/converters.ts:

const timestamp = momentInstance.unix() * 1000;

moment#unix() returns whole seconds (floored), so the millisecond part is lost. Using momentInstance.valueOf() keeps it. The Temporal based v2 serializer in @sap-cloud-sdk/temporal-de-serializers already uses epochMilliseconds and does not have this problem.

I have a fix with a regression test ready and can open a PR if you assign this to me.

Lingua principale
TypeScript
Stelle
221
Fork
79
Merge medio
13h 27m
PR unite (30g)
22

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di SAP/cloud-sdk-js

Tutte le issue di SAP/cloud-sdk-js

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.