@Override
	public final String toString() {
		final StringBuilder result = new StringBuilder();
		final boolean hasDate = this.hasDate();
		if (hasDate) {
			result.append(String.format("%04d-%02d-%02d", this._yearValue_(), this._monthValue_(), this._dateValue_()));
		}
		if (this.hasTime()) {
			if (hasDate) {
				result.append('T');
			}
			result.append(String.format("%02d:%02d:%02d", this._hourValue_(), this._minuteValue_(), this._secondValue_()));
			final int millisecond = this._millisecondValue_();
			if (millisecond != 0) {
				result.append(String.format(".%03d", millisecond));
			}
		}
		if (this.hasZone()) {
			final int zone = this._zoneValue_();
			if (zone == 0) {
				result.append('Z');
			} else {
				final int zoneAbs = Math.abs(zone);
				result.append(zone < 0 ? '-' : '+').append(String.format("%02d:%02d", zoneAbs / 60, zoneAbs % 60));
			}
		}
		return result.toString();
	}