From 652ccbdf3111766fadc379a8cf4650b744e1e19c Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 28 Jun 2013 00:43:19 +0200 Subject: [PATCH] i#108348 API CHANGE: add IsUTC to css.util.DateTime etc. Add IsUTC member to: com.sun.star.util.DateTime com.sun.star.util.DateTimeRange com.sun.star.util.Time Add new stucts with explicit time zones: com.sun.star.util.DateTimeWithTimezone com.sun.star.util.DateWithTimezone com.sun.star.util.TimeWithTimezone Adapt the sax::Converter to read/write timezones, and fix the unit test. Everything else just uses default (no time zone), this commit is just to fix the API. STRUCT: /UCR/com/sun/star/util/DateTime nFields1 = 7 != nFields2 = 8 Registry2 contains 1 more fields STRUCT: /UCR/com/sun/star/util/DateTimeRange nFields1 = 14 != nFields2 = 15 Registry2 contains 1 more fields STRUCT: /UCR/com/sun/star/util/Time nFields1 = 4 != nFields2 = 5 Registry2 contains 1 more fields Conflicts: sc/source/filter/oox/unitconverter.cxx Change-Id: I01f7a6d082a6b090c8efe71d2de137474c495c18 Reviewed-on: https://gerrit.libreoffice.org/4833 Reviewed-by: Eike Rathke Tested-by: Eike Rathke --- comphelper/source/misc/anycompare.cxx | 3 + .../source/commontools/dbconversion.cxx | 5 +- .../source/drivers/file/FDateFunctions.cxx | 10 +- .../odbcbase/ODatabaseMetaDataResultSet.cxx | 5 +- .../source/drivers/odbcbase/OResultSet.cxx | 5 +- .../source/propctrlr/standardcontrol.cxx | 3 +- forms/source/xforms/convert.cxx | 10 +- offapi/UnoApi_offapi.mk | 3 + offapi/com/sun/star/util/Date.idl | 3 +- offapi/com/sun/star/util/DateTime.idl | 7 +- offapi/com/sun/star/util/DateTimeRange.idl | 8 +- .../sun/star/util/DateTimeWithTimezone.idl | 43 ++++ offapi/com/sun/star/util/DateWithTimezone.idl | 43 ++++ offapi/com/sun/star/util/Time.idl | 7 +- offapi/com/sun/star/util/TimeWithTimezone.idl | 44 ++++ offapi/type_reference/offapi.rdb | Bin 6824448 -> 6822400 bytes oox/source/docprop/docprophandler.cxx | 4 +- .../tests/java/ifc/sdbc/_XParameters.java | 4 +- reportdesign/source/core/sdr/RptObject.cxx | 3 +- sax/qa/cppunit/test_converter.cxx | 63 +++--- sax/source/tools/converter.cxx | 204 +++++++++++++++--- sc/source/filter/oox/unitconverter.cxx | 14 +- .../ui/annotations/annotationmanager.cxx | 5 +- sfx2/source/appl/sfxpicklist.cxx | 2 +- sfx2/source/dialog/dinfdlg.cxx | 16 +- sfx2/source/doc/SfxDocumentMetaData.cxx | 5 +- sfx2/source/doc/objcont.cxx | 4 +- sfx2/source/doc/oleprops.cxx | 13 +- sfx2/source/view/viewprn.cxx | 2 +- svl/source/items/dateitem.cxx | 4 +- svtools/source/misc/templatefoldercache.cxx | 3 +- svtools/source/svhtml/parhtml.cxx | 3 +- sw/source/core/doc/docglbl.cxx | 3 +- sw/source/filter/ww8/ww8par.cxx | 2 +- toolkit/source/controls/unocontrols.cxx | 2 +- ucb/source/ucp/ftp/ftpdirp.hxx | 3 +- ucb/source/ucp/gio/gio_content.cxx | 2 +- unotools/source/misc/datetime.cxx | 3 +- .../source/rtftok/rtfdocumentimpl.cxx | 2 +- xmloff/source/chart/SchXMLExport.cxx | 2 +- 40 files changed, 452 insertions(+), 115 deletions(-) create mode 100644 offapi/com/sun/star/util/DateTimeWithTimezone.idl create mode 100644 offapi/com/sun/star/util/DateWithTimezone.idl create mode 100644 offapi/com/sun/star/util/TimeWithTimezone.idl diff --git a/comphelper/source/misc/anycompare.cxx b/comphelper/source/misc/anycompare.cxx index 775386e9c083..30e805a791fc 100644 --- a/comphelper/source/misc/anycompare.cxx +++ b/comphelper/source/misc/anycompare.cxx @@ -70,6 +70,7 @@ namespace comphelper || !( _rhs >>= rhs ) ) throw ::com::sun::star::lang::IllegalArgumentException(); + // FIXME Timezone? if ( lhs.Year < rhs.Year ) return true; @@ -100,6 +101,7 @@ namespace comphelper || !( _rhs >>= rhs ) ) throw ::com::sun::star::lang::IllegalArgumentException(); + // FIXME Timezone? if ( lhs.Hours < rhs.Hours ) return true; @@ -135,6 +137,7 @@ namespace comphelper || !( _rhs >>= rhs ) ) throw ::com::sun::star::lang::IllegalArgumentException(); + // FIXME Timezone? if ( lhs.Year < rhs.Year ) return true; diff --git a/connectivity/source/commontools/dbconversion.cxx b/connectivity/source/commontools/dbconversion.cxx index 651c8f01be78..a09e09f04c46 100644 --- a/connectivity/source/commontools/dbconversion.cxx +++ b/connectivity/source/commontools/dbconversion.cxx @@ -109,7 +109,8 @@ namespace dbtools utl::Date aDate(_rDateTime.Day,_rDateTime.Month,_rDateTime.Year); OUStringBuffer aTemp(toDateString(aDate)); aTemp.appendAscii(" "); - utl::Time aTime(_rDateTime.NanoSeconds,_rDateTime.Seconds,_rDateTime.Minutes,_rDateTime.Hours); + utl::Time const aTime(_rDateTime.NanoSeconds, _rDateTime.Seconds, + _rDateTime.Minutes, _rDateTime.Hours, _rDateTime.IsUTC); aTemp.append( toTimeString(aTime) ); return aTemp.makeStringAndClear(); } @@ -459,7 +460,7 @@ namespace dbtools aTime = toTime( _sSQLString.copy( nSeparation ) ); return utl::DateTime(aTime.NanoSeconds, aTime.Seconds, aTime.Minutes, aTime.Hours, - aDate.Day, aDate.Month, aDate.Year); + aDate.Day, aDate.Month, aDate.Year, false); } //----------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/file/FDateFunctions.cxx b/connectivity/source/drivers/file/FDateFunctions.cxx index a24c46d5c153..1bea9fec099f 100644 --- a/connectivity/source/drivers/file/FDateFunctions.cxx +++ b/connectivity/source/drivers/file/FDateFunctions.cxx @@ -263,7 +263,9 @@ ORowSetValue OOp_CurTime::operate(const ::std::vector& lhs) const return ORowSetValue(); Time aCurTime( Time::SYSTEM ); - return ::com::sun::star::util::Time(aCurTime.GetNanoSec(),aCurTime.GetSec(),aCurTime.GetMin(),aCurTime.GetHour()); + return ::com::sun::star::util::Time(aCurTime.GetNanoSec(), + aCurTime.GetSec(), aCurTime.GetMin(), aCurTime.GetHour(), + false); } //------------------------------------------------------------------ ORowSetValue OOp_Now::operate(const ::std::vector& lhs) const @@ -272,8 +274,10 @@ ORowSetValue OOp_Now::operate(const ::std::vector& lhs) const return ORowSetValue(); DateTime aCurTime( DateTime::SYSTEM ); - return ::com::sun::star::util::DateTime(aCurTime.GetNanoSec(),aCurTime.GetSec(),aCurTime.GetMin(),aCurTime.GetHour(), - aCurTime.GetDay(),aCurTime.GetMonth(),aCurTime.GetYear()); + return ::com::sun::star::util::DateTime(aCurTime.GetNanoSec(), + aCurTime.GetSec(), aCurTime.GetMin(), aCurTime.GetHour(), + aCurTime.GetDay(), aCurTime.GetMonth(), aCurTime.GetYear(), + false); } //------------------------------------------------------------------ diff --git a/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx b/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx index fec060d556c1..fbb1b597a0b0 100644 --- a/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx +++ b/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx @@ -418,7 +418,7 @@ OUString SAL_CALL ODatabaseMetaDataResultSet::getString( sal_Int32 columnIndex ) OTools::getValue(m_pConnection,m_aStatementHandle,columnIndex,m_pConnection->useOldDateFormat() ? SQL_C_TIME : SQL_C_TYPE_TIME,m_bWasNull,**this,&aTime,sizeof aTime); else m_bWasNull = sal_True; - return Time(0,aTime.second,aTime.minute,aTime.hour); + return Time(0, aTime.second,aTime.minute,aTime.hour, false); } // ------------------------------------------------------------------------- @@ -436,7 +436,8 @@ OUString SAL_CALL ODatabaseMetaDataResultSet::getString( sal_Int32 columnIndex ) OTools::getValue(m_pConnection,m_aStatementHandle,columnIndex,m_pConnection->useOldDateFormat() ? SQL_C_TIMESTAMP : SQL_C_TYPE_TIMESTAMP,m_bWasNull,**this,&aTime,sizeof aTime); else m_bWasNull = sal_True; - return DateTime(aTime.fraction,aTime.second,aTime.minute,aTime.hour,aTime.day,aTime.month,aTime.year); + return DateTime(aTime.fraction, aTime.second, aTime.minute, aTime.hour, + aTime.day, aTime.month, aTime.year, false); } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/odbcbase/OResultSet.cxx b/connectivity/source/drivers/odbcbase/OResultSet.cxx index 4c644fe5154a..e841de41ce59 100644 --- a/connectivity/source/drivers/odbcbase/OResultSet.cxx +++ b/connectivity/source/drivers/odbcbase/OResultSet.cxx @@ -650,7 +650,7 @@ Time OResultSet::impl_getTime( sal_Int32 columnIndex ) throw(SQLException, Runti TIME_STRUCT aTime = impl_getValue< TIME_STRUCT > ( columnIndex, m_pStatement->getOwnConnection()->useOldDateFormat() ? SQL_C_TIME : SQL_C_TYPE_TIME ); - return Time(0,aTime.second,aTime.minute,aTime.hour); + return Time(0, aTime.second,aTime.minute,aTime.hour, false); } Time SAL_CALL OResultSet::getTime( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { @@ -668,7 +668,8 @@ DateTime OResultSet::impl_getTimestamp( sal_Int32 columnIndex ) throw(SQLExcepti aTime.hour, aTime.day, aTime.month, - aTime.year); + aTime.year, + false); } DateTime SAL_CALL OResultSet::getTimestamp( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { diff --git a/extensions/source/propctrlr/standardcontrol.cxx b/extensions/source/propctrlr/standardcontrol.cxx index 60f533ac9df1..13ae9779365a 100644 --- a/extensions/source/propctrlr/standardcontrol.cxx +++ b/extensions/source/propctrlr/standardcontrol.cxx @@ -99,7 +99,8 @@ namespace pcr if ( !getTypedControlWindow()->GetText().isEmpty() ) { ::Time aTime( getTypedControlWindow()->GetTime() ); - util::Time aUNOTime( aTime.GetNanoSec(), aTime.GetSec(), aTime.GetMin(), aTime.GetHour() ); + util::Time const aUNOTime( aTime.GetNanoSec(), aTime.GetSec(), + aTime.GetMin(), aTime.GetHour(), false ); aPropValue <<= aUNOTime; } return aPropValue; diff --git a/forms/source/xforms/convert.cxx b/forms/source/xforms/convert.cxx index a89ef2bedf7d..651ecc1f89b2 100644 --- a/forms/source/xforms/convert.cxx +++ b/forms/source/xforms/convert.cxx @@ -338,7 +338,7 @@ namespace // ------------------------------------------------------------------------ UNOTime lcl_toUNOTime( const OUString& rString ) { - UNOTime aTime( 0, 0, 0, 0 ); + UNOTime aTime; bool bWellformed = ISO8601parseTime(rString, aTime); @@ -362,7 +362,7 @@ namespace // all okay? if ( !bWellformed ) - return UNOTime( 0, 0, 0, 0 ); + return UNOTime(); return aTime; } @@ -382,7 +382,8 @@ namespace UNODate aDate( aDateTime.Day, aDateTime.Month, aDateTime.Year ); OUString sDate = lcl_toXSD_UNODate_typed( aDate ); - UNOTime aTime( aDateTime.NanoSeconds, aDateTime.Seconds, aDateTime.Minutes, aDateTime.Hours ); + UNOTime const aTime( aDateTime.NanoSeconds, aDateTime.Seconds, + aDateTime.Minutes, aDateTime.Hours, aDateTime.IsUTC); OUString sTime = lcl_toXSD_UNOTime_typed( aTime ); OUStringBuffer sInfo; @@ -405,7 +406,6 @@ namespace if ( nDateTimeSep == -1 ) { // no time part aDate = lcl_toUNODate( rString ); - aTime = UNOTime( 0, 0, 0, 0 ); } else { @@ -414,7 +414,7 @@ namespace } UNODateTime aDateTime( aTime.NanoSeconds, aTime.Seconds, aTime.Minutes, aTime.Hours, - aDate.Day, aDate.Month, aDate.Year + aDate.Day, aDate.Month, aDate.Year, aTime.IsUTC ); return makeAny( aDateTime ); } diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk index 5a7f329e19e6..174c03b1adb2 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -4035,7 +4035,9 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,offapi/com/sun/star/util,\ DataEditorEvent \ DataEditorEventType \ Date \ + DateWithTimezone \ DateTime \ + DateTimeWithTimezone \ DateTimeRange \ Duration \ ElementChange \ @@ -4056,6 +4058,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,offapi/com/sun/star/util,\ SortField \ SortFieldType \ Time \ + TimeWithTimezone \ TriState \ URL \ VetoException \ diff --git a/offapi/com/sun/star/util/Date.idl b/offapi/com/sun/star/util/Date.idl index ecbda5a8b307..796a6325be63 100644 --- a/offapi/com/sun/star/util/Date.idl +++ b/offapi/com/sun/star/util/Date.idl @@ -20,11 +20,12 @@ #define __com_sun_star_util_Date_idl__ - module com { module sun { module star { module util { /** represents a date value. + + The time zone is unknown. */ published struct Date { diff --git a/offapi/com/sun/star/util/DateTime.idl b/offapi/com/sun/star/util/DateTime.idl index 312589f9eb73..68793ee7feaf 100644 --- a/offapi/com/sun/star/util/DateTime.idl +++ b/offapi/com/sun/star/util/DateTime.idl @@ -20,7 +20,6 @@ #define __com_sun_star_util_DateTime_idl__ - module com { module sun { module star { module util { @@ -61,7 +60,11 @@ published struct DateTime */ short Year; - /** TODO: timezone **/ + /** true: time zone is UTC false: unknown time zone. + + @since LibreOffice 4.1 + */ + boolean IsUTC; }; diff --git a/offapi/com/sun/star/util/DateTimeRange.idl b/offapi/com/sun/star/util/DateTimeRange.idl index b56a0484e494..60ea92bf8c84 100644 --- a/offapi/com/sun/star/util/DateTimeRange.idl +++ b/offapi/com/sun/star/util/DateTimeRange.idl @@ -20,7 +20,6 @@ #define __com_sun_star_util_DateTimeRange_idl__ - module com { module sun { module star { module util { @@ -84,7 +83,12 @@ published struct DateTimeRange */ short EndYear; - /** TODO timezones **/ + /** true: time zone is UTC false: unknown time zone. + + @since LibreOffice 4.1 + */ + boolean IsUTC; + }; diff --git a/offapi/com/sun/star/util/DateTimeWithTimezone.idl b/offapi/com/sun/star/util/DateTimeWithTimezone.idl new file mode 100644 index 000000000000..6f40e6b3beb9 --- /dev/null +++ b/offapi/com/sun/star/util/DateTimeWithTimezone.idl @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __com_sun_star_util_DateTimeTZ_idl__ +#define __com_sun_star_util_DateTimeTZ_idl__ + +#include + + +module com { module sun { module star { module util { + +/** represents a combined date+time value with time zone. + + @since LibreOffice 4.1 + */ +struct DateTimeWithTimeZone +{ + /** the date and time (in TimeZone) + */ + DateTime DateTimeInTZ; + + /** contains the time zone, as signed offset in minutes *from* UTC, + that is *east* of UTC, that is the amount of minutes that should + be added to UTC time to obtain the time in that timezone. + + To obtain UTC datetime from DateTimeInTZ, you need to *subtract* + TimeZone minutes. + */ + short Timezone; +}; + + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/offapi/com/sun/star/util/DateWithTimezone.idl b/offapi/com/sun/star/util/DateWithTimezone.idl new file mode 100644 index 000000000000..928a9c43de59 --- /dev/null +++ b/offapi/com/sun/star/util/DateWithTimezone.idl @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __com_sun_star_util_DateTZ_idl__ +#define __com_sun_star_util_DateTZ_idl__ + +#include + + +module com { module sun { module star { module util { + +/** represents a date value with time zone. + + @since LibreOffice 4.1 + */ +struct DateWithTimeZone +{ + /** the date. + @note XMLSchema-2 defines this as a 24 hour interval. + The TimeZone shifts the interval along the UTC time line. + */ + Date DateInTZ; + + /** contains the time zone, as signed offset in minutes *from* UTC, + that is *east* of UTC, that is the amount of minutes that should + be added to UTC time to obtain time in that timezone. + */ + short Timezone; +}; + + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ + diff --git a/offapi/com/sun/star/util/Time.idl b/offapi/com/sun/star/util/Time.idl index 1ac850f31797..5bf0b9d57450 100644 --- a/offapi/com/sun/star/util/Time.idl +++ b/offapi/com/sun/star/util/Time.idl @@ -20,7 +20,6 @@ #define __com_sun_star_util_Time_idl__ - module com { module sun { module star { module util { @@ -44,6 +43,12 @@ published struct Time */ unsigned short Hours; + /** true: time zone is UTC false: unknown time zone. + + @since LibreOffice 4.1 + */ + boolean IsUTC; + }; diff --git a/offapi/com/sun/star/util/TimeWithTimezone.idl b/offapi/com/sun/star/util/TimeWithTimezone.idl new file mode 100644 index 000000000000..042ff8308ebf --- /dev/null +++ b/offapi/com/sun/star/util/TimeWithTimezone.idl @@ -0,0 +1,44 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef __com_sun_star_util_TimeTZ_idl__ +#define __com_sun_star_util_TimeTZ_idl__ + +#include + + +module com { module sun { module star { module util { + +/** represents a combined time value with time zone. + + @since LibreOffice 4.1 + */ +struct TimeWithTimeZone +{ + /** the time (in TimeZone) + */ + Time TimeInTZ; + + /** contains the time zone, as signed offset in minutes *from* UTC, + that is *east* of UTC, that is the amount of minutes that should + be added to UTC time to obtain the time in that timezone. + + To obtain UTC time from TimeInTZ, you need to *subtract* TimeZone + minutes. + */ + short Timezone; +}; + + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ + diff --git a/offapi/type_reference/offapi.rdb b/offapi/type_reference/offapi.rdb index 7c06f1a2c1317d34f160e1e2c2fb623a0cd432a2..fd83b2292aa3494a4a82aeb85871d58d79fc493a 100644 GIT binary patch delta 17280 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 Ta!gQsSzK*PL|CtfH*^07VdShO diff --git a/oox/source/docprop/docprophandler.cxx b/oox/source/docprop/docprophandler.cxx index 56242e1154a6..b604e9bdf387 100644 --- a/oox/source/docprop/docprophandler.cxx +++ b/oox/source/docprop/docprophandler.cxx @@ -154,7 +154,9 @@ util::DateTime OOXMLDocPropHandler::GetDateTimeFromW3CDTF( const OUString& aChar } } - return util::DateTime( aOslDTime.NanoSeconds, aOslDTime.Seconds, aOslDTime.Minutes, aOslDTime.Hours, aOslDTime.Day, aOslDTime.Month, aOslDTime.Year ); + return util::DateTime( aOslDTime.NanoSeconds, aOslDTime.Seconds, + aOslDTime.Minutes, aOslDTime.Hours, + aOslDTime.Day, aOslDTime.Month, aOslDTime.Year, false); } // ------------------------------------------------ diff --git a/qadevOOo/tests/java/ifc/sdbc/_XParameters.java b/qadevOOo/tests/java/ifc/sdbc/_XParameters.java index e9d9774c0688..9f975420d9b7 100644 --- a/qadevOOo/tests/java/ifc/sdbc/_XParameters.java +++ b/qadevOOo/tests/java/ifc/sdbc/_XParameters.java @@ -357,7 +357,7 @@ public class _XParameters extends MultiMethodTest { else { try { oObj.setTime( - idx, new Time((short)1,(short)2,(short)3,(short)44)) ; + idx, new Time((short)1,(short)2,(short)3,(short)44, false)); } catch (SQLException e) { log.println("Unexpected SQL exception:") ; log.println(e) ; @@ -379,7 +379,7 @@ public class _XParameters extends MultiMethodTest { else { try { oObj.setTimestamp(idx, new DateTime((short)1,(short)2,(short)3, - (short)4, (short)19, (short)01, (short)1979)) ; + (short)4, (short)19, (short)01, (short)1979, false)) ; } catch (SQLException e) { log.println("Unexpected SQL exception:") ; log.println(e) ; diff --git a/reportdesign/source/core/sdr/RptObject.cxx b/reportdesign/source/core/sdr/RptObject.cxx index 33538439b67d..2118cdd4d8fe 100644 --- a/reportdesign/source/core/sdr/RptObject.cxx +++ b/reportdesign/source/core/sdr/RptObject.cxx @@ -1238,7 +1238,8 @@ void OOle2Obj::initializeOle() { uno::Reference< beans::XPropertySet > xChartProps( xCompSupp->getComponent(), uno::UNO_QUERY ); if ( xChartProps.is() ) - xChartProps->setPropertyValue("NullDate",uno::makeAny(util::DateTime(0,0,0,0,1,1,1900))); + xChartProps->setPropertyValue("NullDate", + uno::makeAny(util::DateTime(0,0,0,0,1,1,1900,false))); } } } diff --git a/sax/qa/cppunit/test_converter.cxx b/sax/qa/cppunit/test_converter.cxx index 8a5f72826a92..cfda248adf6c 100644 --- a/sax/qa/cppunit/test_converter.cxx +++ b/sax/qa/cppunit/test_converter.cxx @@ -157,7 +157,8 @@ static bool eqDateTime(util::DateTime a, util::DateTime b) { return a.Year == b.Year && a.Month == b.Month && a.Day == b.Day && a.Hours == b.Hours && a.Minutes == b.Minutes && a.Seconds == b.Seconds - && a.NanoSeconds == b.NanoSeconds; + && a.NanoSeconds == b.NanoSeconds + && a.IsUTC == b.IsUTC; } static void doTest(util::DateTime const & rdt, char const*const pis, @@ -168,13 +169,14 @@ static void doTest(util::DateTime const & rdt, char const*const pis, util::DateTime odt; SAL_INFO("sax.cppunit","about to convert '" << is << "'"); bool bSuccess( Converter::convertDateTime(odt, is) ); - SAL_INFO("sax.cppunit","Y:" << odt.Year << " M:" << odt.Month << " D:" << odt.Day << " H:" << odt.Hours << " M:" << odt.Minutes << " S:" << odt.Seconds << " nS:" << odt.NanoSeconds); + SAL_INFO("sax.cppunit","Y:" << odt.Year << " M:" << odt.Month << " D:" << odt.Day << " H:" << odt.Hours << " M:" << odt.Minutes << " S:" << odt.Seconds << " nS:" << odt.NanoSeconds << " UTC: " << (bool)odt.IsUTC); CPPUNIT_ASSERT(bSuccess); CPPUNIT_ASSERT(eqDateTime(rdt, odt)); OUStringBuffer buf; Converter::convertDateTime(buf, odt, true); SAL_INFO("sax.cppunit","" << buf.getStr()); - CPPUNIT_ASSERT(buf.makeStringAndClear().equalsAscii(pos)); + CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(pos), + buf.makeStringAndClear()); } static void doTestDateTimeF(char const*const pis) @@ -189,43 +191,42 @@ static void doTestDateTimeF(char const*const pis) void ConverterTest::testDateTime() { SAL_INFO("sax.cppunit","\nSAX CONVERTER TEST BEGIN"); - doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1), "0001-01-01T00:00:00" ); - doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1), - "0001-01-01T00:00:00Z", "0001-01-01T00:00:00" ); - doTest( util::DateTime(0, 0, 0, 0, 1, 1, -1), "-0001-01-01T00:00:00"); -// doTest( util::DateTime(0, 0, 0, 0, 1, 1, -1), "-0001-01-01T00:00:00Z"); - doTest( util::DateTime(0, 0, 0, 0, 1, 1, -324), + doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1, false), "0001-01-01T00:00:00" ); + doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1, true), "0001-01-01T00:00:00Z" ); + doTest( util::DateTime(0, 0, 0, 0, 1, 1, -1, false), + "-0001-01-01T00:00:00"); + doTest( util::DateTime(0, 0, 0, 0, 1, 1, -1, true), + "-0001-01-01T01:00:00+01:00", "-0001-01-01T00:00:00Z"); + doTest( util::DateTime(0, 0, 0, 0, 1, 1, -324, false), "-0324-01-01T00:00:00" ); - doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1), - "0001-01-01T00:00:00-00:00", "0001-01-01T00:00:00" ); - doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1), - "0001-01-01T00:00:00+00:00", "0001-01-01T00:00:00" ); - doTest( util::DateTime(0, 0, 0, 0, 2, 1, 1)/*(0, 0, 12, 0, 2, 1, 1)*/, - "0001-01-02T00:00:00-12:00", "0001-01-02T00:00:00" ); -// "0001-02-01T12:00:00" ); - doTest( util::DateTime(0, 0, 0, 0, 2, 1, 1)/*(0, 0, 12, 0, 1, 1, 1)*/, - "0001-01-02T00:00:00+12:00", "0001-01-02T00:00:00" ); -// "0001-01-01T12:00:00" ); - doTest( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999), + doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1, true), + "0001-01-01T00:00:00-00:00", "0001-01-01T00:00:00Z" ); + doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1, true), + "0001-01-01T00:00:00+00:00", "0001-01-01T00:00:00Z" ); + doTest( util::DateTime(0, 0, 0, 12, 2, 1, 1, true), + "0001-01-02T00:00:00-12:00", "0001-01-02T12:00:00Z" ); + doTest( util::DateTime(0, 0, 0, 12, 1, 1, 1, true), + "0001-01-02T00:00:00+12:00", "0001-01-01T12:00:00Z" ); + doTest( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999, false), "9999-12-31T23:59:59.99", "9999-12-31T23:59:59.990000000" ); - doTest( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999), - "9999-12-31T23:59:59.99Z", "9999-12-31T23:59:59.990000000" ); - doTest( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999), + doTest( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999, true), + "9999-12-31T23:59:59.99Z", "9999-12-31T23:59:59.990000000Z" ); + doTest( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999, false), "9999-12-31T23:59:59.9999999999999999999999999999999999999", "9999-12-31T23:59:59.999999999" ); - doTest( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999), + doTest( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999, true), "9999-12-31T23:59:59.9999999999999999999999999999999999999Z", - "9999-12-31T23:59:59.999999999" ); - doTest( util::DateTime(0, 0, 0, 0, 29, 2, 2000), // leap year - "2000-02-29T00:00:00-00:00", "2000-02-29T00:00:00" ); - doTest( util::DateTime(0, 0, 0, 0, 29, 2, 1600), // leap year - "1600-02-29T00:00:00-00:00", "1600-02-29T00:00:00" ); - doTest( util::DateTime(0, 0, 0, 24, 1, 1, 333) + "9999-12-31T23:59:59.999999999Z" ); + doTest( util::DateTime(0, 0, 0, 0, 29, 2, 2000, true), // leap year + "2000-02-29T00:00:00-00:00", "2000-02-29T00:00:00Z" ); + doTest( util::DateTime(0, 0, 0, 0, 29, 2, 1600, true), // leap year + "1600-02-29T00:00:00-00:00", "1600-02-29T00:00:00Z" ); + doTest( util::DateTime(0, 0, 0, 24, 1, 1, 333, false) /*(0, 0, 0, 0, 2, 1, 333)*/, "0333-01-01T24:00:00"/*, "0333-01-02T00:00:00"*/ ); // While W3C XMLSchema specifies a minimum of 4 year digits we are lenient // in what we accept. - doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1), + doTest( util::DateTime(0, 0, 0, 0, 1, 1, 1, false), "1-01-01T00:00:00", "0001-01-01T00:00:00" ); doTestDateTimeF( "+0001-01-01T00:00:00" ); // invalid: ^+ doTestDateTimeF( "0001-1-01T00:00:00" ); // invalid: < 2 M diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx index 690c3e581c51..e99690e91546 100644 --- a/sax/source/tools/converter.cxx +++ b/sax/source/tools/converter.cxx @@ -28,6 +28,7 @@ #include #include +#include #include @@ -1185,13 +1186,48 @@ bool Converter::convertDuration(util::Duration& rDuration, } +static void +lcl_AppendTimezone(OUStringBuffer & i_rBuffer, sal_Int16 const nOffset) +{ + if (0 == nOffset) + { + i_rBuffer.append(sal_Unicode('Z')); + } + else + { + if (0 < nOffset) + { + i_rBuffer.append(sal_Unicode('+')); + } + else + { + i_rBuffer.append(sal_Unicode('-')); + } + const sal_Int32 nHours (abs(nOffset) / 60); + const sal_Int32 nMinutes(abs(nOffset) % 60); + SAL_WARN_IF(nHours > 14 || (nHours == 14 && nMinutes > 0), + "sax", "convertDateTime: timezone overflow"); + if (nHours < 10) + { + i_rBuffer.append('0'); + } + i_rBuffer.append(nHours); + i_rBuffer.append(':'); + if (nMinutes < 10) + { + i_rBuffer.append('0'); + } + i_rBuffer.append(nMinutes); + } +} + /** convert util::Date to ISO "date" string */ void Converter::convertDate( OUStringBuffer& i_rBuffer, const util::Date& i_rDate) { - const util::DateTime dt( - 0, 0, 0, 0, i_rDate.Day, i_rDate.Month, i_rDate.Year); + const util::DateTime dt(0, 0, 0, 0, + i_rDate.Day, i_rDate.Month, i_rDate.Year, false); convertDateTime(i_rBuffer, dt, false); } @@ -1260,6 +1296,17 @@ void Converter::convertDateTime( i_rBuffer.append(OUString::createFromAscii(ostr.str().c_str())); } } + + sal_uInt16 * pTimezone(0); // FIXME pass this as parameter + if (pTimezone) + { + lcl_AppendTimezone(i_rBuffer, *pTimezone); + } + else if (i_rDateTime.IsUTC) + { + // append local time + lcl_AppendTimezone(i_rBuffer, 0); + } } /** convert ISO "date" or "dateTime" string to util::DateTime */ @@ -1279,6 +1326,10 @@ bool Converter::convertDateTime( util::DateTime& rDateTime, rDateTime.Minutes = 0; rDateTime.Seconds = 0; rDateTime.NanoSeconds = 0; + // FIXME +#if 0 + rDateTime.IsUTC = date.IsUTC; +#endif } return true; } @@ -1288,6 +1339,99 @@ bool Converter::convertDateTime( util::DateTime& rDateTime, } } +static bool lcl_isLeapYear(const sal_uInt32 nYear) +{ + return ((nYear % 4) == 0) + && (((nYear % 100) != 0) || ((nYear % 400) == 0)); +} + +static sal_uInt16 +lcl_MaxDaysPerMonth(const sal_Int32 nMonth, const sal_Int32 nYear) +{ + static sal_uInt16 s_MaxDaysPerMonth[12] = + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + OSL_ASSERT(0 < nMonth && nMonth <= 12); + if ((2 == nMonth) && lcl_isLeapYear(nYear)) + { + return 29; + } + return s_MaxDaysPerMonth[nMonth - 1]; +} + +static void lcl_ConvertToUTC( + sal_Int16 & o_rYear, sal_uInt16 & o_rMonth, sal_uInt16 & o_rDay, + sal_uInt16 & o_rHours, sal_uInt16 & o_rMinutes, + sal_Int16 const nSourceOffset) +{ + sal_Int16 nOffsetHours(abs(nSourceOffset) / 60); + sal_Int16 const nOffsetMinutes(abs(nSourceOffset) % 60); + o_rMinutes += nOffsetMinutes; + if (nSourceOffset < 0) + { + o_rMinutes += nOffsetMinutes; + if (60 <= o_rMinutes) + { + o_rMinutes -= 60; + ++nOffsetHours; + } + o_rHours += nOffsetHours; + if (o_rHours < 24) + { + return; + } + while (24 <= o_rHours) + { + o_rHours -= 24; + ++o_rDay; + } + sal_Int16 const nDaysInMonth(lcl_MaxDaysPerMonth(o_rMonth, o_rYear)); + if (o_rDay <= nDaysInMonth) + { + return; + } + o_rDay -= nDaysInMonth; + ++o_rMonth; + if (o_rMonth <= 12) + { + return; + } + o_rMonth = 1; + ++o_rYear; // works for negative year too + } + else if (0 < nSourceOffset) + { + // argh everything is unsigned + if (o_rMinutes < nOffsetMinutes) + { + o_rMinutes += 60; + ++nOffsetHours; + } + o_rMinutes -= nOffsetMinutes; + sal_Int16 nDaySubtract(0); + while (o_rHours < nOffsetHours) + { + o_rHours += 24; + ++nDaySubtract; + } + o_rHours -= nOffsetHours; + if (nDaySubtract < o_rDay) + { + o_rDay -= nDaySubtract; + return; + } + sal_Int16 const nPrevMonth((o_rMonth == 1) ? 12 : o_rMonth - 1); + sal_Int16 const nDaysInMonth(lcl_MaxDaysPerMonth(nPrevMonth, o_rYear)); + o_rDay += nDaysInMonth; + --o_rMonth; + if (0 == o_rMonth) + { + o_rMonth = 12; + --o_rYear; // works for negative year too + } + o_rDay -= nDaySubtract; + } +} + static bool readDateTimeComponent(const OUString & rString, sal_Int32 & io_rnPos, sal_Int32 & o_rnTarget, @@ -1309,24 +1453,7 @@ readDateTimeComponent(const OUString & rString, return true; } -static bool lcl_isLeapYear(const sal_uInt32 nYear) -{ - return ((nYear % 4) == 0) - && (((nYear % 100) != 0) || ((nYear % 400) == 0)); -} -static sal_uInt16 -lcl_MaxDaysPerMonth(const sal_Int32 nMonth, const sal_Int32 nYear) -{ - static sal_uInt16 s_MaxDaysPerMonth[12] = - { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - OSL_ASSERT(0 < nMonth && nMonth <= 12); - if ((2 == nMonth) && lcl_isLeapYear(nYear)) - { - return 29; - } - return s_MaxDaysPerMonth[nMonth - 1]; -} /** convert ISO "date" or "dateTime" string to util::DateTime or util::Date */ bool Converter::convertDateOrDateTime( @@ -1526,13 +1653,11 @@ bool Converter::convertDateOrDateTime( bSuccess &= (nPos == string.getLength()); // trailing junk? - if (bSuccess && bHaveTimezone) - { - // util::DateTime does not support timezones! - } - if (bSuccess) { + sal_uInt16 * pTimezone(0); // FIXME pass this as parameter + sal_Int16 const nTimezoneOffset = ((bHaveTimezoneMinus) ? (-1) : (+1)) + * ((nTimezoneHours * 60) + nTimezoneMinutes); if (bHaveTime) // time is optional { rDateTime.Year = @@ -1543,6 +1668,25 @@ bool Converter::convertDateOrDateTime( rDateTime.Minutes = static_cast(nMinutes); rDateTime.Seconds = static_cast(nSeconds); rDateTime.NanoSeconds = static_cast(nNanoSeconds); + if (bHaveTimezone) + { + if (pTimezone) + { + *pTimezone = nTimezoneOffset; + rDateTime.IsUTC = (0 == nTimezoneOffset); + } + else + { + lcl_ConvertToUTC(rDateTime.Year, rDateTime.Month, + rDateTime.Day, rDateTime.Hours, rDateTime.Minutes, + nTimezoneOffset); + rDateTime.IsUTC = true; + } + } + else + { + rDateTime.IsUTC = false; + } rbDateTime = true; } else @@ -1551,6 +1695,18 @@ bool Converter::convertDateOrDateTime( ((isNegative) ? (-1) : (+1)) * static_cast(nYear); rDate.Month = static_cast(nMonth); rDate.Day = static_cast(nDay); + if (bHaveTimezone) + { + if (pTimezone) + { + *pTimezone = nTimezoneOffset; + } + else + { + // a Date cannot be adjusted + SAL_INFO("sax", "dropping timezone"); + } + } rbDateTime = false; } } diff --git a/sc/source/filter/oox/unitconverter.cxx b/sc/source/filter/oox/unitconverter.cxx index 780168c9760e..0db45415fdec 100644 --- a/sc/source/filter/oox/unitconverter.cxx +++ b/sc/source/filter/oox/unitconverter.cxx @@ -67,7 +67,7 @@ void lclSkipYearBlock( sal_Int32& ornDays, sal_Int16& ornYear, sal_Int32 nDaysIn /** Returns the number of days before the passed date, starting from the null date 0000-Jan-01, using standard leap year conventions. */ -sal_Int32 lclGetDays( const css::util::Date& rDate ) +sal_Int32 lclGetDays( const Date& rDate ) { // number of days in all full years before passed date including all leap days sal_Int32 nDays = rDate.Year * 365 + ((rDate.Year + 3) / 4) - ((rDate.Year + 99) / 100) + ((rDate.Year + 399) / 400); @@ -98,7 +98,7 @@ sal_Int32 lclGetDays( const css::util::Date& rDate ) UnitConverter::UnitConverter( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ), maCoeffs( UNIT_ENUM_SIZE, 1.0 ), - mnNullDate( lclGetDays( css::util::Date( 30, 12, 1899 ) ) ) + mnNullDate( lclGetDays( Date( 30, 12, 1899 ) ) ) { // initialize constant and default coefficients const DeviceInfo& rDeviceInfo = getBaseFilter().getGraphicHelper().getDeviceInfo(); @@ -157,7 +157,7 @@ void UnitConverter::finalizeImport() } } -void UnitConverter::finalizeNullDate( const css::util::Date& rNullDate ) +void UnitConverter::finalizeNullDate( const Date& rNullDate ) { // convert the nulldate to number of days since 0000-Jan-01 mnNullDate = lclGetDays( rNullDate ); @@ -180,17 +180,17 @@ double UnitConverter::scaleFromMm100( sal_Int32 nMm100, Unit eUnit ) const return static_cast< double >( nMm100 ) / getCoefficient( eUnit ); } -double UnitConverter::calcSerialFromDateTime( const css::util::DateTime& rDateTime ) const +double UnitConverter::calcSerialFromDateTime( const DateTime& rDateTime ) const { - sal_Int32 nDays = lclGetDays( css::util::Date( rDateTime.Day, rDateTime.Month, rDateTime.Year ) ) - mnNullDate; + sal_Int32 nDays = lclGetDays( Date( rDateTime.Day, rDateTime.Month, rDateTime.Year ) ) - mnNullDate; OSL_ENSURE( nDays >= 0, "UnitConverter::calcDateTimeSerial - invalid date" ); OSL_ENSURE( (rDateTime.Hours <= 23) && (rDateTime.Minutes <= 59) && (rDateTime.Seconds <= 59), "UnitConverter::calcDateTimeSerial - invalid time" ); return nDays + rDateTime.Hours / 24.0 + rDateTime.Minutes / 1440.0 + rDateTime.Seconds / 86400.0; } -css::util::DateTime UnitConverter::calcDateTimeFromSerial( double fSerial ) const +DateTime UnitConverter::calcDateTimeFromSerial( double fSerial ) const { - css::util::DateTime aDateTime( 0, 0, 0, 0, 1, 1, 0 ); + DateTime aDateTime( 0, 0, 0, 0, 1, 1, 0, false ); double fDays = 0.0; double fTime = modf( fSerial, &fDays ); diff --git a/sd/source/ui/annotations/annotationmanager.cxx b/sd/source/ui/annotations/annotationmanager.cxx index f0b3d388c7bc..5d95892ceddc 100644 --- a/sd/source/ui/annotations/annotationmanager.cxx +++ b/sd/source/ui/annotations/annotationmanager.cxx @@ -143,7 +143,10 @@ static SfxDispatcher* getDispatcher( ViewShellBase& rBase ) com::sun::star::util::DateTime getCurrentDateTime() { DateTime aCurrentDate( DateTime::SYSTEM ); - return com::sun::star::util::DateTime( 0, aCurrentDate.GetSec(), aCurrentDate.GetMin(), aCurrentDate.GetHour(), aCurrentDate.GetDay(), aCurrentDate.GetMonth(), aCurrentDate.GetYear() ); + return com::sun::star::util::DateTime( 0, aCurrentDate.GetSec(), + aCurrentDate.GetMin(), aCurrentDate.GetHour(), + aCurrentDate.GetDay(), aCurrentDate.GetMonth(), + aCurrentDate.GetYear(), false ); } OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation ) diff --git a/sfx2/source/appl/sfxpicklist.cxx b/sfx2/source/appl/sfxpicklist.cxx index f18b1db0b3da..a32cfee1fe78 100644 --- a/sfx2/source/appl/sfxpicklist.cxx +++ b/sfx2/source/appl/sfxpicklist.cxx @@ -367,7 +367,7 @@ void SfxPickList::Notify( SfxBroadcaster&, const SfxHint& rHint ) xDocProps->setCreationDate( util::DateTime( now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), - now.GetYear() ) ); + now.GetYear(), false) ); } if ( bAllowModif ) diff --git a/sfx2/source/dialog/dinfdlg.cxx b/sfx2/source/dialog/dinfdlg.cxx index 153d17ca5896..c741c3959e4a 100644 --- a/sfx2/source/dialog/dinfdlg.cxx +++ b/sfx2/source/dialog/dinfdlg.cxx @@ -99,7 +99,8 @@ bool operator==(const util::DateTime &i_rLeft, const util::DateTime &i_rRight) && i_rLeft.Hours == i_rRight.Hours && i_rLeft.Minutes == i_rRight.Minutes && i_rLeft.Seconds == i_rRight.Seconds - && i_rLeft.NanoSeconds == i_rRight.NanoSeconds; + && i_rLeft.NanoSeconds == i_rRight.NanoSeconds + && i_rLeft.IsUTC == i_rRight.IsUTC; } // STATIC DATA ----------------------------------------------------------- @@ -353,7 +354,7 @@ void SfxDocumentInfoItem::resetUserData(const OUString & i_rAuthor) DateTime now( DateTime::SYSTEM ); setCreationDate( util::DateTime( now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), - now.GetDay(), now.GetMonth(), now.GetYear() ) ); + now.GetDay(), now.GetMonth(), now.GetYear(), false) ); setModifiedBy(OUString()); setPrintedBy(OUString()); setModificationDate(util::DateTime()); @@ -799,7 +800,7 @@ IMPL_LINK_NOARG(SfxDocumentPage, DeleteHdl) DateTime now( DateTime::SYSTEM ); util::DateTime uDT( now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), - now.GetDay(), now.GetMonth(), now.GetYear() ); + now.GetDay(), now.GetMonth(), now.GetYear(), false); m_pCreateValFt->SetText( ConvertDateTime_Impl( aName, uDT, rLocaleWrapper ) ); OUString aEmpty; m_pChangeValFt->SetText( aEmpty ); @@ -1866,8 +1867,10 @@ Sequence< beans::PropertyValue > CustomPropertiesWindow::GetCustomProperties() c { Date aTmpDate = pLine->m_aDateField.GetDate(); Time aTmpTime = pLine->m_aTimeField.GetTime(); - util::DateTime aDateTime(aTmpTime.GetNanoSec(), aTmpTime.GetSec(), aTmpTime.GetMin(), aTmpTime.GetHour(), - aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear() ); + util::DateTime const aDateTime(aTmpTime.GetNanoSec(), + aTmpTime.GetSec(), aTmpTime.GetMin(), aTmpTime.GetHour(), + aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear(), + false); aPropertiesSeq[i].Value <<= aDateTime; } else if ( CUSTOM_TYPE_DURATION == nType ) @@ -1877,7 +1880,8 @@ Sequence< beans::PropertyValue > CustomPropertiesWindow::GetCustomProperties() c else if ( CUSTOM_TYPE_DATE == nType ) { Date aTmpDate = pLine->m_aDateField.GetDate(); - util::Date aDate(aTmpDate.GetDay(), aTmpDate.GetMonth(), aTmpDate.GetYear()); + util::Date const aDate(aTmpDate.GetDay(), aTmpDate.GetMonth(), + aTmpDate.GetYear()); aPropertiesSeq[i].Value <<= aDate; } diff --git a/sfx2/source/doc/SfxDocumentMetaData.cxx b/sfx2/source/doc/SfxDocumentMetaData.cxx index fe08d67a0fcd..520db84f3e12 100644 --- a/sfx2/source/doc/SfxDocumentMetaData.cxx +++ b/sfx2/source/doc/SfxDocumentMetaData.cxx @@ -413,7 +413,8 @@ bool operator== (const css::util::DateTime &i_rLeft, && i_rLeft.Hours == i_rRight.Hours && i_rLeft.Minutes == i_rRight.Minutes && i_rLeft.Seconds == i_rRight.Seconds - && i_rLeft.NanoSeconds == i_rRight.NanoSeconds; + && i_rLeft.NanoSeconds == i_rRight.NanoSeconds + && i_rLeft.IsUTC == i_rRight.IsUTC; } // NB: keep these two arrays in sync! @@ -1828,7 +1829,7 @@ SfxDocumentMetaData::resetUserData(const OUString & the_value) bModified |= setMetaText("meta:initial-creator", the_value); ::DateTime now( ::DateTime::SYSTEM ); css::util::DateTime uDT(now.GetNanoSec(), now.GetSec(), now.GetMin(), - now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear()); + now.GetHour(), now.GetDay(), now.GetMonth(), now.GetYear(), false); bModified |= setMetaText("meta:creation-date", dateTimeToText(uDT)); bModified |= setMetaText("dc:creator", OUString()); bModified |= setMetaText("meta:printed-by", OUString()); diff --git a/sfx2/source/doc/objcont.cxx b/sfx2/source/doc/objcont.cxx index c697f6393d6b..811836910891 100644 --- a/sfx2/source/doc/objcont.cxx +++ b/sfx2/source/doc/objcont.cxx @@ -205,7 +205,7 @@ void SfxObjectShell::UpdateDocInfoForSave() xDocProps->setModificationDate( util::DateTime( now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), - now.GetYear() ) ); + now.GetYear(), false) ); xDocProps->setModifiedBy( aUserName ); if ( !HasName() || pImp->bIsSaving ) // QUESTION: not in case of "real" SaveAs as this is meant to create a new document @@ -836,7 +836,7 @@ void SfxObjectShell::ResetFromTemplate( const String& rTemplateName, const Strin xDocProps->setTemplateDate( util::DateTime( now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), now.GetDay(), now.GetMonth(), - now.GetYear() ) ); + now.GetYear(), false) ); SetQueryLoadTemplate( sal_True ); } diff --git a/sfx2/source/doc/oleprops.cxx b/sfx2/source/doc/oleprops.cxx index a8888cd72336..6b16d3c46eab 100644 --- a/sfx2/source/doc/oleprops.cxx +++ b/sfx2/source/doc/oleprops.cxx @@ -40,8 +40,10 @@ using ::com::sun::star::uno::makeAny; using namespace ::com::sun::star; #define TIMESTAMP_INVALID_DATETIME ( DateTime ( Date ( 1, 1, 1601 ), Time ( 0, 0, 0 ) ) ) /// Invalid value for date and time to create invalid instance of TimeStamp. -#define TIMESTAMP_INVALID_UTILDATETIME ( util::DateTime ( 0, 0, 0, 0, 1, 1, 1601 ) ) /// Invalid value for date and time to create invalid instance of TimeStamp. -#define TIMESTAMP_INVALID_UTILDATE ( util::Date ( 1, 1, 1601 ) ) /// Invalid value for date to create invalid instance of TimeStamp. +/// Invalid value for date and time to create invalid instance of TimeStamp. +#define TIMESTAMP_INVALID_UTILDATETIME (util::DateTime(0, 0, 0, 0, 1, 1, 1601, false)) +/// Invalid value for date to create invalid instance of TimeStamp. +#define TIMESTAMP_INVALID_UTILDATE (util::Date(1, 1, 1601)) static bool operator==(const util::DateTime &i_rLeft, const util::DateTime &i_rRight) @@ -52,7 +54,8 @@ bool operator==(const util::DateTime &i_rLeft, const util::DateTime &i_rRight) && i_rLeft.Hours == i_rRight.Hours && i_rLeft.Minutes == i_rRight.Minutes && i_rLeft.Seconds == i_rRight.Seconds - && i_rLeft.NanoSeconds == i_rRight.NanoSeconds; + && i_rLeft.NanoSeconds == i_rRight.NanoSeconds + && i_rLeft.IsUTC == i_rRight.IsUTC; } static @@ -587,6 +590,7 @@ void SfxOleFileTimeProperty::ImplLoad( SvStream& rStrm ) maDateTime.Minutes = aDateTime.GetMin(); maDateTime.Seconds = aDateTime.GetSec(); maDateTime.NanoSeconds = aDateTime.GetNanoSec(); + maDateTime.IsUTC = false; } void SfxOleFileTimeProperty::ImplSave( SvStream& rStrm ) @@ -895,7 +899,8 @@ void SfxOleSection::SetDateValue( sal_Int32 nPropId, const util::Date& rValue ) SetProperty( SfxOlePropertyRef( new SfxOleFileTimeProperty( nPropId, TIMESTAMP_INVALID_UTILDATETIME ) ) ); else { - const util::DateTime aValue(0, 0, 0, 0, rValue.Day, rValue.Month, rValue.Year ); + const util::DateTime aValue(0, 0, 0, 0, rValue.Day, rValue.Month, + rValue.Year, false ); SetProperty( SfxOlePropertyRef( new SfxOleFileTimeProperty( nPropId, aValue ) ) ); } } diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx index dab76f34b1f6..555bc8f2ffb6 100644 --- a/sfx2/source/view/viewprn.cxx +++ b/sfx2/source/view/viewprn.cxx @@ -317,7 +317,7 @@ void SfxPrinterController::jobStarted() xDocProps->setPrintDate( util::DateTime( now.GetNanoSec(), now.GetSec(), now.GetMin(), now.GetHour(), - now.GetDay(), now.GetMonth(), now.GetYear() ) ); + now.GetDay(), now.GetMonth(), now.GetYear(), false) ); SFX_APP()->NotifyEvent( SfxEventHint(SFX_EVENT_PRINTDOC, GlobalEventConfig::GetEventName( STR_EVENT_PRINTDOC ), mpObjectShell ) ); uno::Sequence < beans::PropertyValue > aOpts; diff --git a/svl/source/items/dateitem.cxx b/svl/source/items/dateitem.cxx index 67ebba630cc9..be6017334edb 100644 --- a/svl/source/items/dateitem.cxx +++ b/svl/source/items/dateitem.cxx @@ -29,6 +29,7 @@ #include #include + // STATIC DATA ----------------------------------------------------------- DBG_NAME(SfxDateTimeItem) @@ -182,7 +183,8 @@ bool SfxDateTimeItem::QueryValue( com::sun::star::uno::Any& rVal, aDateTime.GetHour(), aDateTime.GetDay(), aDateTime.GetMonth(), - aDateTime.GetYear() ); + aDateTime.GetYear(), + false); rVal <<= aValue; return true; } diff --git a/svtools/source/misc/templatefoldercache.cxx b/svtools/source/misc/templatefoldercache.cxx index c0237203d63c..9866c95211d5 100644 --- a/svtools/source/misc/templatefoldercache.cxx +++ b/svtools/source/misc/templatefoldercache.cxx @@ -97,7 +97,8 @@ namespace svt && _rLHS.Hours == _rRHS.Hours && _rLHS.Day == _rRHS.Day && _rLHS.Month == _rRHS.Month - && _rLHS.Year == _rRHS.Year; + && _rLHS.Year == _rRHS.Year + && _rLHS.IsUTC == _rRHS.IsUTC; } //--------------------------------------------------------------------- diff --git a/svtools/source/svhtml/parhtml.cxx b/svtools/source/svhtml/parhtml.cxx index 4a59b02656ce..123ca853bcb4 100644 --- a/svtools/source/svhtml/parhtml.cxx +++ b/svtools/source/svhtml/parhtml.cxx @@ -2187,7 +2187,8 @@ bool HTMLParser::ParseMetaOptionsImpl( ::util::DateTime uDT(aDateTime.GetNanoSec(), aDateTime.GetSec(), aDateTime.GetMin(), aDateTime.GetHour(), aDateTime.GetDay(), - aDateTime.GetMonth(), aDateTime.GetYear()); + aDateTime.GetMonth(), aDateTime.GetYear(), + false); if ( HTML_META_CREATED==nAction ) i_xDocProps->setCreationDate( uDT ); else diff --git a/sw/source/core/doc/docglbl.cxx b/sw/source/core/doc/docglbl.cxx index 28eb1f48e1f1..c3c55aa63f7b 100644 --- a/sw/source/core/doc/docglbl.cxx +++ b/sw/source/core/doc/docglbl.cxx @@ -282,7 +282,8 @@ bool SwDoc::SplitDoc( sal_uInt16 eDocType, const String& rPath, bool bOutline, c ::util::DateTime uDT(aTmplDate.GetNanoSec(), aTmplDate.GetSec(), aTmplDate.GetMin(), aTmplDate.GetHour(), aTmplDate.GetDay(), - aTmplDate.GetMonth(), aTmplDate.GetYear()); + aTmplDate.GetMonth(), aTmplDate.GetYear(), + false ); xDocProps->setTemplateDate(uDT); xDocProps->setTemplateURL(rPath); // Set the new doc's title to the text of the "split para". diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index ce231d65fa78..9920c0703bfc 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -1499,7 +1499,7 @@ void SwWW8ImplReader::ImportDop() ::util::DateTime uDT(aLastPrinted.GetNanoSec(), aLastPrinted.GetSec(), aLastPrinted.GetMin(), aLastPrinted.GetHour(), aLastPrinted.GetDay(), - aLastPrinted.GetMonth(), aLastPrinted.GetYear()); + aLastPrinted.GetMonth(), aLastPrinted.GetYear(), false); xDocuProps->setPrintDate(uDT); } diff --git a/toolkit/source/controls/unocontrols.cxx b/toolkit/source/controls/unocontrols.cxx index 19c50afff5c6..f5ec93aaecb6 100644 --- a/toolkit/source/controls/unocontrols.cxx +++ b/toolkit/source/controls/unocontrols.cxx @@ -3309,7 +3309,7 @@ void UnoDateFieldControl::textChanged( const awt::TextEvent& e ) throw(uno::Runt if ( xText.is() && xText->getText().getLength() ) // and in real, the text of the peer is *not* empty // -> simulate an invalid date, which is different from "no date" - aValue <<= util::Date( 0, 0, 0 ); + aValue <<= util::Date(); } } else diff --git a/ucb/source/ucp/ftp/ftpdirp.hxx b/ucb/source/ucp/ftp/ftpdirp.hxx index f8e04b9f138f..54249ee8c12f 100644 --- a/ucb/source/ucp/ftp/ftpdirp.hxx +++ b/ucb/source/ucp/ftp/ftpdirp.hxx @@ -54,7 +54,8 @@ namespace ftp { hours, day, month, - year) { } + year, + false) { } void SetYear(sal_uInt16 year) { Year = year; } void SetMonth(sal_uInt16 month) { Month = month; } diff --git a/ucb/source/ucp/gio/gio_content.cxx b/ucb/source/ucp/gio/gio_content.cxx index faa022bfe5f9..ac5ba3aef271 100644 --- a/ucb/source/ucp/gio/gio_content.cxx +++ b/ucb/source/ucp/gio/gio_content.cxx @@ -391,7 +391,7 @@ static util::DateTime getDateFromUnix (time_t t) if ( osl_getDateTimeFromTimeValue( &tv, &dt ) ) return util::DateTime( 0, dt.Seconds, dt.Minutes, dt.Hours, - dt.Day, dt.Month, dt.Year); + dt.Day, dt.Month, dt.Year, false); else return util::DateTime(); } diff --git a/unotools/source/misc/datetime.cxx b/unotools/source/misc/datetime.cxx index 5101ee0ae70d..9119bc37f027 100644 --- a/unotools/source/misc/datetime.cxx +++ b/unotools/source/misc/datetime.cxx @@ -25,6 +25,7 @@ #include #include + namespace { sal_Int32 impl_pow(sal_Int32 x, sal_Int32 y) @@ -299,7 +300,7 @@ bool ISO8601parseDateTime(const OUString &rString, starutil::DateTime& rDateTime if (bSuccess) { rDateTime = starutil::DateTime(aTime.NanoSeconds, aTime.Seconds, aTime.Minutes, aTime.Hours, - aDate.Day, aDate.Month, aDate.Year); + aDate.Day, aDate.Month, aDate.Year, false); } return bSuccess; diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 1673b735299b..77a5d310f72d 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -189,7 +189,7 @@ static const char* lcl_RtfToString(RTFKeyword nKeyword) static util::DateTime lcl_getDateTime(RTFParserState& aState) { return util::DateTime(0 /*100sec*/, 0 /*sec*/, aState.nMinute, aState.nHour, - aState.nDay, aState.nMonth, aState.nYear); + aState.nDay, aState.nMonth, aState.nYear, false); } static void lcl_DestinationToMath(OUStringBuffer& rDestinationText, oox::formulaimport::XmlStreamBuilder& rMathBuffer, bool& rMathNor) diff --git a/xmloff/source/chart/SchXMLExport.cxx b/xmloff/source/chart/SchXMLExport.cxx index 7f766ff95ed6..5602ea6d62a4 100644 --- a/xmloff/source/chart/SchXMLExport.cxx +++ b/xmloff/source/chart/SchXMLExport.cxx @@ -1165,7 +1165,7 @@ void SchXMLExportHelper_Impl::parseDocument( Reference< chart::XChartDocument >& sal_Bool bHasMainTitle = sal_False; sal_Bool bHasSubTitle = sal_False; sal_Bool bHasLegend = sal_False; - util::DateTime aNullDate(0,0,0,0,30,12,1899); + util::DateTime aNullDate(0,0,0,0,30,12,1899, false); std::vector< XMLPropertyState > aPropertyStates;