public DateTime sub(DateTime dateTime) {
        
        int ms    = this._ms    - dateTime.getMilliSeconds();
        int s     = this._s     - dateTime.getSeconds();
        int m     = this._m     - dateTime.getMinute();
        int h     = this._h     - dateTime.getHour();
        int day   = this._day   - dateTime.getDay();
        int month = this._month - dateTime.getMonth();
        int year  = this._year  - dateTime.getYear();
        
        // Fix underflows
        while (ms < 0) { s--; ms = 1000 + ms; }
        while (s < 0) { m--; s = 60 + s; }
        while (m < 0) { h--; m = 60 + m; }
        while (h < 0) { day--; h = 24 + h; }
        while (day < 0) { month--; day = 31 + day; }
        while (month < 0) { year--; month = 12 + month; }
        
        // Return new DateTime with values
        return new DateTime(h, m, s, ms, day, month, year);
    }