geier: looks good, thanks! Could you please add a warning to the user? 
hobarrera: LGTM
diff --git a/AUTHORS.txt b/AUTHORS.txt
index 4c1283d..5123a7c 100644
--- a/AUTHORS.txt
+++ b/AUTHORS.txt
@@ -28,3 +28,4 @@ Troy Sankey - sankeytms [at] gmail [dot] com
 Mart Lubbers - mart [at] martlubbers [dot] net
 Paweł Fertyk - pfertyk [at] openmailbox [dot] org
 Moritz Kobel - moritz [at] kobelnet [dot] ch - http://www.kobelnet.ch
+Guilhem Saurel - guilhem [at] saurel [dot] me - https://saurel.me
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index fce5319..4dd4fcc 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -31,6 +31,8 @@ not released yet
 * `import` can now import multiple files at once (Christian Geier)
 * configuration file path $XDG_CONFIG_HOME/khal/config is now supported and
   $XDG_CONFIG_HOME/khal/khal.conf deprecated
+* events that start and end at the same time are now displayed as if their
+  duration was one hour instead of one day (Guilhem Saurel)
 
 ikhal
 -----
diff --git a/khal/khalendar/utils.py b/khal/khalendar/utils.py
index b03d7da..27e16bc 100644
--- a/khal/khalendar/utils.py
+++ b/khal/khalendar/utils.py
@@ -189,7 +189,7 @@ def sanitize(vevent, default_timezone, href='', calendar=''):
 
 def sanitize_timerange(dtstart, dtend, duration=None):
     '''return sensible dtstart and end for events that have an invalid or
-    missing DTEND, assuming the event just lasts one day.'''
+    missing DTEND, assuming the event just lasts one hour.'''
 
     if isinstance(dtstart, datetime) and isinstance(dtend, datetime):
         if dtstart.tzinfo and not dtend.tzinfo:
@@ -214,7 +214,11 @@ def sanitize_timerange(dtstart, dtend, duration=None):
             raise ValueError('The event\'s end time (DTEND) is older than '
                              'the event\'s start time (DTSTART).')
         elif dtend == dtstart:
-            dtend += timedelta(days=1)
+            logger.warning(
+                "Event start time and end time are the same. "
+                "Assuming the event's duration is one hour."
+            )
+            dtend += timedelta(hours=1)
 
     return dtstart, dtend
 

iCal, DTSTART == DTEND
Currently, when DTSTART == DTEND khal shows things like:

```
Today:
20:00→ : "blah foo bar"
Tomorrow:
  → 20:00: "blah foo bar"
```

Google Agenda assume that event last 1 hour.
Neither behavior is perfect and both are better than omitting the event.
But khal output seems more confusing and by assuming that event last 24h give the visual impression that 2 distinct event happens (especially if other events happens in the timespan).

Assuming up the end-of-the-day, or, like Google 1 hour, could be better trade-off.

diff --git a/tests/khalendar_aux_test.py b/tests/khalendar_aux_test.py
index dbe60e9..6fe9316 100644
--- a/tests/khalendar_aux_test.py
+++ b/tests/khalendar_aux_test.py
@@ -736,6 +736,17 @@ END:VEVENT
 END:VCALENDAR
 """
 
+instant = """
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:instant123
+DTSTART;TZID=Europe/Berlin;VALUE=DATE-TIME:20170113T010000
+DTEND;TZID=Europe/Berlin;VALUE=DATE-TIME:20170113T010000
+SUMMARY:Really fast event
+END:VEVENT
+END:VCALENDAR
+"""
+
 
 class TestSanitize(object):
 
@@ -754,3 +765,9 @@ class TestSanitize(object):
     def test_duration(self):
         vevent = _get_vevent_file('event_dtr_exdatez')
         vevent = utils.sanitize(vevent, berlin, '', '')
+
+    def test_instant(self):
+        vevent = _get_vevent(instant)
+        assert vevent['DTEND'].dt - vevent['DTSTART'].dt == timedelta()
+        vevent = utils.sanitize(vevent, berlin, '', '')
+        assert vevent['DTEND'].dt - vevent['DTSTART'].dt == timedelta(hours=1)

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov codecov
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
atomicwrites==1.4.1
certifi==2025.1.31
charset-normalizer==3.4.1
click==8.1.8
codecov==2.1.13
configobj==5.0.9
coverage==7.8.0
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
icalendar==6.1.3
idna==3.10
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
-e git+https://github.com/pimutils/khal.git@52b9da07a2a94ccf9c0d05aaacb633e14378aee5#egg=khal
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
pytest-cov==6.0.0
python-dateutil==2.9.0.post0
pytz==2025.2
pyxdg==0.28
requests==2.32.3
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions==4.13.0
tzdata==2025.2
tzlocal==5.3.1
urllib3==2.3.0
urwid==2.6.16
wcwidth==0.2.13

name: khal
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - atomicwrites==1.4.1
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - click==8.1.8
      - codecov==2.1.13
      - configobj==5.0.9
      - coverage==7.8.0
      - icalendar==6.1.3
      - idna==3.10
      - pytest-cov==6.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyxdg==0.28
      - requests==2.32.3
      - six==1.17.0
      - typing-extensions==4.13.0
      - tzdata==2025.2
      - tzlocal==5.3.1
      - urllib3==2.3.0
      - urwid==2.6.16
      - wcwidth==0.2.13
prefix: /opt/conda/envs/khal

tests/khalendar_aux_test.py::TestSanitize::test_instant
tests/khalendar_aux_test.py::TestExpand::test_expand_dt tests/khalendar_aux_test.py::TestExpand::test_expand_dtb tests/khalendar_aux_test.py::TestExpand::test_expand_dttz tests/khalendar_aux_test.py::TestExpand::test_expand_invalid_exdate tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_dtr_exdatez tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_rrule_notz_until_z tests/khalendar_aux_test.py::TestSpecial::test_until_notz tests/khalendar_aux_test.py::TestSpecial::test_another_problem tests/khalendar_aux_test.py::TestSpecial::test_event_exdate_dt tests/khalendar_aux_test.py::TestSpecial::test_event_exdates_dt tests/khalendar_aux_test.py::TestSpecial::test_event_exdatesl_dt tests/khalendar_aux_test.py::TestSpecial::test_event_dt_rrule_invalid_until2 tests/khalendar_aux_test.py::TestRDate::test_simple_rdate tests/khalendar_aux_test.py::TestRDate::test_rrule_and_rdate
tests/khalendar_aux_test.py::TestExpand::test_expand_dtf tests/khalendar_aux_test.py::TestExpand::test_expand_d tests/khalendar_aux_test.py::TestExpand::test_expand_dtz tests/khalendar_aux_test.py::TestExpand::test_expand_dtzb tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_dt tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_dtb tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_dttz tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_dtf tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_d tests/khalendar_aux_test.py::TestExpandNoRR::test_expand_rrule_exdate_z tests/khalendar_aux_test.py::TestSpecial::test_count tests/khalendar_aux_test.py::TestSpecial::test_until_d_notz tests/khalendar_aux_test.py::TestSpecial::test_latest_bug tests/khalendar_aux_test.py::TestSpecial::test_event_dt_rrule_invalid_until tests/khalendar_aux_test.py::TestRDate::test_rrule_past tests/khalendar_aux_test.py::TestRDate::test_rdate_date tests/khalendar_aux_test.py::TestSanitize::test_noend_date tests/khalendar_aux_test.py::TestSanitize::test_noend_datetime tests/khalendar_aux_test.py::TestSanitize::test_duration
khal/khalendar/utils.py AUTHORS.txt CHANGELOG.rst
khal/khalendar/utils.py AUTHORS.txt CHANGELOG.rst