Para cada evento, além do "tempo do evento", você também precisa manter o controle de mais um atributo de tempo, a hora da última modificação. Isso cuida do cenário de sincronização simples e, ehm, digamos, sem intercorrências: eventos que foram modificados desde a última vez em que a sincronização foi copiada.
Os problemas começam se houver a possibilidade de que dois eventos tenham sido modificados desde a última sincronização, e você não queira alterar atributos de uma sobrescrita de atributos alterados na outra. Nós chamamos essa situação de "conflito". A fim de superar os conflitos, você poderia controlar o tempo da última modificação de cada atributo dentro de um evento, mas isso a) complicaria muito as coisas, eb) só resolveria conflitos nos casos em que atributos diferentes fossem alterados . Você ainda teria um problema quando o mesmo atributo fosse alterado. Portanto, uma abordagem melhor para lidar com conflitos é sempre apresentar ao usuário os dois registros lado a lado, destacar os atributos alterados e deixá-los decidir qual atributo alterado do registro à esquerda substitui o atributo correspondente no registro correto e vice-versa.
O caso de eventos sobrepostos também pode ser visto como um conflito, que precisa ser tratado especialmente: ou a duração de um evento (aquele ocorrendo no início do tempo) precisará ser encurtado, ou a hora de início do evento. outro evento (aquele ocorrendo mais tarde no tempo) terá que ser movido para frente, possivelmente também ajustando sua duração.