Enquanto para a maioria das operações de data e hora eu normalmente converteria para Unixtime e executaria subtração de adição etc. no inteiro Unixtime, você pode querer olhar para a classe Zend_Date do framework Zend.
Isso tem muitas das funcionalidades que você descreve. Embora Zend seja anunciado como um "framework", ele funciona excepcionalmente bem como uma biblioteca de classes para escolher elementos. Nós o incluímos rotineiramente em projetos e, em seguida, apenas extraímos pedaços conforme e quando precisamos deles.