FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour ISO 8601 Week Numbers
Posts: 824
Joined: Thu Oct 13, 2005 07:39 AM
Re: ISO 8601 Week Numbers
Posted: Wed Dec 31, 2008 12:42 AM

my pleasure :D

kind regards

Stefan
Posts: 4043
Joined: Wed Dec 19, 2007 06:40 PM
Re: ISO 8601 Week Numbers
Posted: Wed Dec 31, 2008 01:21 AM
Hello Stefan,

29.12.2008 = 1. Week in January 2009


What is correct now ?
Week 53 in 2008 or Week 1 in 2009 ?

Regards
Uwe :-)
Since 1995 ( the first release of FW 1.9 )

i work with FW.

If you have any questions about special functions, maybe i can help.
Posts: 1467
Joined: Mon Oct 10, 2005 11:26 AM
Re: ISO 8601 Week Numbers
Posted: Wed Dec 31, 2008 11:31 AM

Uwe,

Normally 29th, 30th and 31st of December 2008 are in week 53,
1st, 2nd, 3rd and 4th of January 2009 are in week 1.

It is normal to my opinion. 52 weeks are 364 days so there are 1 or 2 additional days. Depending what day of week January 1st is, there are more than 2 days in week 53.

Happy 2009 to you all.

Regards,

Regards,

Michel D.
Genk (Belgium)


_____________________________________________________________________________________________

I use : FiveWin for (x)Harbour v. 25.12 - Harbour 3.2.0 (May 2025) - xHarbour Builder (January 2020) - Bcc773

Posts: 312
Joined: Sat Oct 08, 2005 09:12 AM
Re: ISO 8601 Week Numbers
Posted: Wed Dec 31, 2008 11:53 AM
driessen wrote:Uwe,

...
It is normal to my opinion. 52 weeks are 364 days so there are 1 or 2 additional days.
...
Happy 2009 to you all.

Regards,

Michel,

unfortunatelly ISO 8601 does not care for 'normal opinions' or 'normal thinking'. :-)

Regards,
Detlef
Posts: 824
Joined: Thu Oct 13, 2005 07:39 AM
Re: ISO 8601 Week Numbers
Posted: Wed Dec 31, 2008 03:17 PM
ukoenig wrote:Hello Stefan,

29.12.2008 = 1. Week in January 2009

What is correct now ?
Week 53 in 2008 or Week 1 in 2009 ?


Hi Uwe,

In 2008 there is no 53th week, week 1 of 2009 is correct.

There would be only a 53th week if at least 4 days of the last week are in the old year, beginning on Monday as the first day of the week. If today (31.12.08) would be a Thursday, 2008 would have 53 weeks. It´s very impotant to have in mind that the first day of a week is Monday.

Einen Guten Rutsch in´s Neue Jahr
kind regards

Stefan
Posts: 729
Joined: Tue Oct 18, 2005 06:49 PM
Re: ISO 8601 Week Numbers
Posted: Wed Dec 31, 2008 07:18 PM
Hi Darrel,

Try this code and let me know if it's working fine for you.

*
ÕìÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³ FUNCTION WOYEAR()
ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³
³  Short:
³  ------
³  WOYEAR() Calculates week of the year (# of 7 day periods)
³
³  Returns:
³  --------
³  <nWeek> => week of the year of date
³
³  Syntax:
³  -------
³  WOYEAR(dDate)
³
³  Description:
³  ------------
³  Calculates number of 7 day periods passed for the
³  year from <dDate>
³
³  Examples:
³  ---------
³   dDate    := ctod("10/15/90")
³
³   nWoYear  := WOYEAR(dDate)
³
³   // (returns 40)
³
³  Source:
³  -------
³  S_WOYEAR.PRG
³
ÔíÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
*/
FUNCTION woyear(dDate)
local nDayOfYear := DOYEAR(dDate)
RETURN INT(nDayOfYear/7)+IIF(nDayOfYear%7>0,1,0)



 /*
ÕìÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³ FUNCTION DOYEAR()
ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³
³  Short:
³  ------
³  DOYEAR() Calculates day of the year from date
³
³  Returns:
³  --------
³  <nDayOfYear> => day of the year of date
³
³  Syntax:
³  -------
³  DOYEAR(dTarget)
³
³  Description:
³  ------------
³  Calculates day of the year from <dTarget>
³
³  Examples:
³  ---------
³   dDate   := ctod("10/15/90")
³   nDoYear := DOYEAR(dDate)   //(returns 288)
³
³  Source:
³  -------
³  S_DOYEAR.PRG
³
ÔíÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
*/
FUNCTION doyear(dInDate)
local nOldDate, nReturn
nOldDate := SET_DATE(1)
nReturn  :=  dInDate- CTOD("01/01/"+RIGHT(DTOC(dInDate),2)) +1
SET_DATE(nOldDate)
RETURN nReturn








#define D_AMERICAN    "mm/dd/yy"
#define D_ANSI        "yy.mm.dd"
#define D_BRITISH     "dd/mm/yy"
#define D_FRENCH      "dd/mm/yy"
#define D_GERMAN      "dd.mm.yy"
#define D_ITALIAN     "dd-mm-yy"
#define D_JAPANESE    "yy/mm/dd"
#define D_USA         "mm-dd-yy"


/*
ÕìÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³ FUNCTION SET_DATE()
ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³
³  Short:
³  ------
³  SET_DATE() Sets and restores date format
³
³  Returns:
³  --------
³  <nFormat> => previous SET DATE format 1-5
³
³  Syntax:
³  -------
³  SET_DATE([nFormatNew])
³
³  Description:
³  ------------
³  Return current SET DATE setting <nFormat> and
³  optionally set to new format [nFormatNew]
³
³  [nFormatNew] =    1  American
³                    2  British/French
³                    3  German
³                    4  ANSI
³                    5  Italian
³
³  Examples:
³  ---------
³   nOldformat := SET_DATE(5)
³
³   ** SET TO ITALIAN
³
³   * code
³
³   * more code
³
³   SET_DATE(nOldformat)   // restore to prior setting
³
³  Source:
³  -------
³  S_SETDAT.PRG
³
ÔíÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
*/
FUNCTION SET_DATE(nNewFormat)
local nOldFormat,cOldFormat
local lOldCent := SETCENT(.f.)
nOldFormat := 0
cOldFormat :=  lower(SET(_SET_DATEFORMAT))
do case
case cOldFormat == D_AMERICAN
  nOldFormat := 1
case cOldFormat == D_BRITISH
  nOldFormat := 2
case cOldFormat == D_FRENCH
  nOldFormat := 2
case cOldFormat == D_GERMAN
  nOldFormat := 3
case cOldFormat == D_ANSI
  nOldFormat := 4
case cOldFormat == D_ITALIAN     // last, but not least
  nOldFormat := 5
endcase

if nNewFormat#nil
  DO CASE
  CASE nNewFormat = 1
         SET DATE AMERICAN
  CASE nNewFormat = 2
         SET DATE BRITISH
  CASE nNewFormat = 3
         SET DATE GERMAN
  CASE nNewFormat = 4
         SET DATE ANSI
  CASE nNewFormat = 5
         SET DATE ITALIAN
  ENDCASE
endif

SETCENT(lOldCent)
return nOldFormat


 /*
ÕìÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³ FUNCTION SETCENT()
ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
³
³  Short:
³  ------
³  SETCENT() Determines if century is on/off
³
³  Returns:
³  --------
³  <lCentury> => Century is on/off
³
³  Syntax:
³  -------
³  SETCENT([lCentury])
³
³  Description:
³  ------------
³  Returns current SET CENTURY setting and optionally
³  sets century on/off
³
³  [lCentury]  True = ON False = OFF
³
³  Examples:
³  ---------
³   lOldcentury := SETCENT(.f.)   //  SET CENTURY OFF
³
³   // code
³
³   SETCENT(lOldcentury)
³
³  Source:
³  -------
³  S_SETCEN.PRG
³
ÔíÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
*/
FUNCTION SETCENT(lCentury)
local lOld
lOld = (LEN(DTOC(DATE()))==10)
if lCentury#nil
 SET CENTURY (lCentury)
endif
return lOld



Regards,


George

Continue the discussion