Пока выяснил, что поведение отличается только при положительном ts.tm_isdst. (Наверное, в реальной жизни это обычно и не нужно, и у меня ts.tm_isdst=1 надо менять на -1. Но интересно, что такое отличие наблюдается.)