GEDCOM date‑constraint semantics should not be propagated into Gramps

Subject: GEDCOM date‑constraint semantics should not be propagated into Gramps

First of all, apologies for raising this here, but I’ve recently become aware of a fairly serious issue in how dates are handled — both in GEDCOM and, as far as I can tell, also in Gramps. Because this PR touches the same area, I feel it’s important to surface it now before the problem becomes further embedded.

This concerns how GEDCOM represents date ranges, and how those semantics differ from historical chronology.

GEDCOM uses expressions like “Not Earlier Than” and “Not Later Than”, which are not historical concepts. They originate from constraint logic used in workflow/task‑management systems. In GEDCOM, these constraints are treated as boundaries starting at the beginning of a year or period.

This creates a fundamental mismatch:

  • A historical After 1850 means “sometime after the end of 1850”.
  • GEDCOM’s Not Earlier Than 1850 means “starting at the beginning of 1850”.

These are not equivalent, and they produce contradictory results when interpreted as if they were historical date ranges.

If Gramps (or this FamilySearch integration) maps GEDCOM’s constraint‑style dates directly into Gramps’ historical date model, the result is a silent distortion of chronology. It effectively rewrites historical periods to fit a scheduling logic that was never intended for historical data.

My request: Before merging this PR, and ideally in Gramps itself, we should ensure that:

  • GEDCOM’s constraint‑based date semantics are not treated as historical ranges
  • Gramps does not reinterpret constraint dates as if they were evidence‑based historical intervals
  • The distinction between historical uncertainty and constraint logic is preserved in the data model and in the sync layer

If this is not addressed, Gramps will continue to inherit a known flaw in GEDCOM’s date semantics, and FamilySearch sync will amplify it by flattening historical periods into constraint boundaries.

This is not a minor formatting issue — it affects historical accuracy and chronological integrity. I would strongly recommend that Gramps introduce a clear separation between:

  • historical date ranges (evidence‑based uncertainty)
  • constraint‑style dates (GEDCOM/FamilySearch operational boundaries)

so that the meaning of the original data is preserved.


Note: This text is AI‑assisted and based on earlier posts I have written, including material originally written in both Norwegian and English and later translated or refined by a language model. The arguments and concerns are mine; the phrasing has simply been clarified.

“AFT 1850” is “AFT (BET 1 JAN 1850 AND 31 DEC 1850)”. And that is for me logically “AFT 1 JAN 1850”. Your historical definition is for me illogical. Maybe the combination of unprecise dates and before/after is not intuitiv for everyone.

What is your proposal?

The semantics of this get complex

AFT 1850 is any date greater than the 23:59:59 on the 31st Dec 1850
BEF 1850 is any date less than 00:00:00 on the 1st Jan 1850

That is why I would prefer to use the mathematical symbols

is AFT as above
= is AFT 00:00:00 on the 1st Jan 1850
< is BEF as above
<= is BEF 23:59:59 on the 31st Dec 1850

BEF & AFT mean different things to different people

Just as long as everyone is singing from the same hymn sheet,
phil

AFT (After) 1850 does not mean “after 1 January 1850”. It means “after the year 1850 has ended”.

In historical, chronological, and mathematical logic:

  • The year 1850 represents the interval [1850‑01‑01, 1850‑12‑31]

Therefore:

  • AFT (After) 1850 means a date > 1850‑12‑31
  • The first valid date is 1851‑01‑01

So:

  • “After 1850” does not include any part of 1850
  • It begins after the period 1850, not at its start

This follows standard mathematical logic:

  • AFT 1850 → date > 1850‑12‑31

@comeng

Regarding the idea that “AFT means different things to different people”:

“After” cannot have multiple subjective meanings in chronology. It has one precise interpretation:

After X = strictly later than the end of X.

This applies whether X is a day, a month, a year, or any defined period. Interpreting “after 1850” as “after 1 January 1850” would invert the meaning of the period, treating the start of 1850 as if it were its end, which contradicts historical usage, mathematical ordering, and common language.

About the LDS/GEDCOM terminology

The fact that LDS/GEDCOM introduced terms like “Not Earlier Than”, “Not Later Than”, and other project‑management‑style constraints into what are otherwise clear historical concepts does not make those interpretations correct.

These terms come from task‑management logic, not from historical chronology. They are used to determine whether future tasks may start earlier or later depending on dependencies and resource availability — not to define historical dates.

Using such constraint‑based terminology as if it were equivalent to historical expressions like before, after, or between can easily lead to incorrect conclusions and faulty calculations in historical data.

For example:

If we say a person was born “after 1850”, this does not mean “sometime in 1850 or later”.

It means:

The person was born after the period 1850, i.e., no earlier than 1 January 1851.

Confusing project‑management constraints with historical chronology produces wrong results.

1 Like

You define:

  • AFT 1850 as any date > 23:59:59 on 31 Dec 1850

But then you say:

  • “= is AFT 00:00:00 on 1 Jan 1850”

Those two statements cannot both be true. If AFT 1850 means after the end of 1850, it cannot at the same time be equal to the very start of 1850.

The same goes for your: <= is BEF 23:59:59 on the 31st Dec 1850.
This is the mathematics for “less than or equal”, i.e. including the whole day of 31 Dec 1850.


With the mathematical logic you are using, the expression “= is AFT 00:00:00 on 1 Jan 1850” would actually imply ≥ 1 Jan 1850 — which contradicts your own definition two lines above that AFT 1850 means any date > 23:59:59 on 31 Dec 1850.

This is the mathematics:

  • After 1850 equals > 1850-12-31
  • From 1850 equals ≥ 1850-01-01
  • Before 1850 equals < 1850-01-01
  • Between 1850 and 1860 equals 1850-12-31 < date < 1860-01-01

Note: some small edits after first save

Are you sure? If Fred is born in 1850, he is not born in an intervall. He is born at a spefic point in time, but the exact day and month are unknown. It is a

  • point - not a period, not a range
  • Temporal precision is limited to the year level
1 Like

I actually wrote

> is AFT as above
>= is AFT 00:00:00 on the 1st Jan 1850
< is BEF as above
<= is BEF 23:59:59 on the 31st Dec 1850

but it seems to have got truncated
phil

Yes I am sure…

a birth is a point in time, but when only the year is known, that point must lie somewhere within the interval [1850‑01‑01, 1850‑12‑31]. The year is the interval, the birth is the point inside the interval.

And following the same logic:

If Fred is born “in 1850”, then he must have been born at some unknown point within that interval **.
** If you instead say he is born AFT 1850 , then he is born after that interval — not inside it.

Thanks Phil — and yes, with your updated symbols we are actually saying the same thing. If AFT 1850 is meant to be “after the end of 1850”, then the earliest possible point is > 1850‑12‑31. If you write “>= 1 Jan 1850”, that instead includes the entire year 1850, which contradicts the definition above.

So we agree:

  • In 1850 → the point lies somewhere inside the interval [1850‑01‑01, 1850‑12‑31]
  • AFT 1850 → the point lies after that interval
  • BEF 1850 → the point lies before that interval

I just want to make sure that everyone in this discussion is aware that the definitions of GEDCOM’s AFT and BEF changed with GEDCOM 7.0. In last August, I wrote the following summary. Please refer to the links for further background info.

This discussion seems to be based on the phrases “no earlier than” and “no later than” which are used in the GEDCOM 7.0 standard, not in the 5.5.1 standard. Gramps currently doesn’t support GEDCOM 7.0 (please correct me if my state of knowledge is outdated) and was built around the definitions in GEDCOM versions before the change of the meaning of AFT and BEF.

I likely don’t have the time to participate in this discussion in-depth. In my opinion, the logical meaning (in Gramps’ documentation/data field definition, code e.g. for comparison/filters, etc.) should be the same as the meaning of the words in the UI (this is important when translating). GEDCOM exporters and importers should deal with the correct processing according to the GEDCOM version used.

1 Like

Yes I am sure…

a birth is a point in time, but when only the year is known, that point must lie somewhere within the interval [1850‑01‑01, 1850‑12‑31]. The year is the interval, the birth is the point inside the interval.

And following the same logic:

If Fred is born “in 1850”, then he must have been born at some unknown point within that interval **.
** If you instead say he is born AFT 1850 , then he is born after that interval — not inside it.

If the Day or the Day and Month are left out of a date, then Gramps interprets this as an interval/span/range, not a point.

If you want specificity, then you have to enter a fully qualified date with day, month and year.

(This is one of the oddities that a genealogist should explore in other software too. Some software will export a date of “1850” as “1 Jan 1850” … or “Mar 1861” as “1 Mar 1861”. That is because they do not truly support incomplete dates as approximations and consider the missing part as “the first of…”. This means that you should be suspicious of any date falling on the 1st of any month. And even more suspicious of dates falling on January 1st.)

One of the things that Gramps does not record well are anniversary dates where the day and month are known but the year is unknown.

1 Like

They are also not used in the GedcomX standard which we use in the FamilySearch integration.

Gramps, Gedcom 5.5.1 and GedcomX appear to be consistent:

Gramps Gedcom 5.5.1 GedcomX
Before 1850 BEF 1850 /+1850
1850 1850 +1850
After 1850 AFT 1850 +1850/

We will just have to be careful when implementing Gedcom 7.0 import/export.

1 Like

That is definitely not correct. If the source says “birth 1850” it is not possible to enter a fully qualified date.

This is the same in many genealogical applications. In GEDCOM you have to use a phrase. How is such a anniversary date imported and exported from/to GEDCOM?

That’s exactly the pertinent issue. Gramps let’s you record a Birth event with a date of 1850 when you do not KNOW the fully qualified date and cannot be specific. And so Gramps treats it as an interval/span/range, not a point.

dates without a year do come in and save as text string. However, that is not the part that I saying that Gramps does not support well.

Gramps has anniversary and birthday reminder calendars. I would like the calendar to support showing that “Tom and Mary Smith have an upcoming anniversary on June 8th” … even where we don’t know what year to record when they were married.

1 Like

In that case, would it make a beneficial difference to enter the date more explicitly as “between 1850-01-01 and 1850-12-31”? I think that would still mean a single (unknown) date, as opposed to a range (“from … to …”)?

Yes, there is a small but important semantic difference between

  • date known with precision of year
  • date in interval with exactly known interval borders