Date Time con Uso Horario

787 views
Skip to first unread message

Baltazar Moreno

unread,
Aug 29, 2011, 5:59:47 PM8/29/11
to publice...@googlegroups.com
Que tal Compañeros:

Un WebService me regresa una hora en éste formato:

2011-08-29T21:57:44.232Z

¿Cómo pasarla a formato? : 2011-08-29T16:57:44

Ojo, es convirtiendo el uso horario, no encuentro información en ningún lado.

Gracias de antemano.
--
Baltazar Moreno
VFP9SP2 - Win7
Guadalajara, Jalisco, México

Intel Man

unread,
Aug 29, 2011, 6:12:53 PM8/29/11
to publice...@googlegroups.com
Hola, primero convierte tu cadena:

2011-08-29T21:57:44.232Z

para que pueda ser leido como un dato datetime  (busca en ayuda como está compuesto el formato datetime)

Luego le restas 5 horas a tu dato ya convertido datetime  (osea 3600 segundos), y lo vuelves a convertir en tu cadena que necesitas

Saludos



Date: Mon, 29 Aug 2011 14:59:47 -0700
From: bmor...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Date Time con Uso Horario

Baltazar Moreno

unread,
Aug 29, 2011, 6:21:30 PM8/29/11
to publice...@googlegroups.com
Y como sé cuantas horas debo restarle?

Ya que para mi caso es 5 horas, pero para otros usuarios, puede cambiar, en México hay varios usos horarios.

Geovanny Quirós Castillo

unread,
Aug 29, 2011, 6:32:19 PM8/29/11
to publice...@googlegroups.com
Amigo Baltazar, puedes crear un parámetro en tu sistema y ahí almacenaras las horas a restar o sumar según la región donde se corra.
Saludos

Baltazar Moreno

unread,
Aug 29, 2011, 6:49:51 PM8/29/11
to publice...@googlegroups.com
No acabo de convencerme en hacer la resta tal cual, porque ahorita en horario de verano son -5 en horario "normal" son 6

Por eso mi pregunta, como obtener en base a la hora del centro cuantas horas debo restarle en este momento a esa fecha.

El SOAP Toolkit lo transforma en automático. ¿Como lo hace?

No habrá otra alternativa, más que hacerlo a mano?

Disculpen la insistencia..

Saludos!

ricardo peña

unread,
Aug 29, 2011, 6:50:51 PM8/29/11
to GRUPO-VFP GRUPO-VFP
Deberías trabajar con una tabla que maneje los usos horarios y
te convierta las horas.
 
De lo contrario, necesitarás migrar a sql server o mysql que manejan
campos con tipo de datos UTC ( hora universal coordinada )

Ricardo Luis Peña
Analista de Sistemas
BA - Argentina
011-15-4440-7378
 

Date: Mon, 29 Aug 2011 15:21:30 -0700
From: bmor...@gmail.com
To: publice...@googlegroups.com
Subject: Re: RE: [vfp] Date Time con Uso Horario

Intel Man

unread,
Aug 29, 2011, 7:01:13 PM8/29/11
to publice...@googlegroups.com
Hola, aquí esta una funcion que te devuelve informacion de la zona horaria configurada en windows:

http://www.news2news.com/vfp/?example=73

Saludos



Date: Mon, 29 Aug 2011 15:21:30 -0700
From: bmor...@gmail.com
To: publice...@googlegroups.com
Subject: Re: RE: [vfp] Date Time con Uso Horario

Baltazar Moreno

unread,
Aug 30, 2011, 10:27:36 AM8/30/11
to publice...@googlegroups.com
En serio no habrá algo más sencillo, en c# basta con ésto:

// strDateTime = "2011-08-29T21:57:44.232Z";
localDateTime = System.DateTime.Parse(strDateTime);

Intel, probré el código que me comentas, de hecho en la página de microsoft (http://support.microsoft.com/kb/194576/es), tmb está algo parecido, pero no logro entender como saber cuantas horas restarle..

Gracias de antemano.

Saludos!

Walter R. Ojeda Valiente

unread,
Aug 30, 2011, 10:35:07 AM8/30/11
to publice...@googlegroups.com
Eso te devuelve la fecha y hora de la computadora, en Visual FoxPro puedes obtener la fecha con la función Date() y la hora con la función Time()

Saludos.

Walter.

Y por supuesto, aún sin novedades del imaginario dios de "extremo".




Date: Tue, 30 Aug 2011 07:27:36 -0700

From: bmor...@gmail.com
To: publice...@googlegroups.com
Subject: Re: RE: [vfp] Date Time con Uso Horario

Baltazar Moreno

unread,
Aug 30, 2011, 10:38:54 AM8/30/11
to publice...@googlegroups.com
No Walter, al pasarle como parámetro la cadena con la fecha/hora, me regresa la hora en base al uso horario que tenga la computadora en la que se corra.

Lo que requiero es convertir ese tipo de datetime (UTC) en el datetime de fox.

Gracias!

Armando Rodríguez

unread,
Aug 30, 2011, 10:47:44 AM8/30/11
to publice...@googlegroups.com

Prueba con esto:

 

#DEFINE ID_INVALID -1

   #DEFINE ID_UNKNOWN 0

   #DEFINE ID_STANDARD 1

   #DEFINE ID_DAYLIGHT 2

   #DEFINE CR CHR(13)

 

   * the definition for TIME_ZONE_INFORMATION is:

   *

   *typedef struct _TIME_ZONE_INFORMATION { // tzi

   *    LONG       Bias;

   *    WCHAR      StandardName[ 32 ];

   *    SYSTEMTIME StandardDate;

   *    LONG       StandardBias;

   *    WCHAR      DaylightName[ 32 ];

   *    SYSTEMTIME DaylightDate;

   *    LONG       DaylightBias;

   *} TIME_ZONE_INFORMATION;

 

   * buffer to receive TIME_ZONE_INFORMATION

   TZInfo = SPACE(172)

 

   DECLARE INTEGER GetTimeZoneInformation IN kernel32 STRING @TZInfo

   liRetCode = GetTimeZoneInformation(@TZInfo)

   DO CASE

      CASE liRetCode = ID_UNKNOWN

         =MESSAGEBOX ("TIME_ZONE_ID_UNKNOWN")

      CASE liRetCode = ID_STANDARD

         =MESSAGEBOX ("TIME_ZONE_ID_STANDARD")

      CASE liRetCode = ID_DAYLIGHT

         =MESSAGEBOX ("TIME_ZONE_ID_DAYLIGHT")

   ENDCASE

 

   * now, parse the returned structure

   liBias = StrToLong(SUBSTR(TZInfo, 1, 4))

 

   * lcStandardName is a Unicode string - strip out chr(0)s for

   * US/English

   lcStandardName = SUBSTR(TZInfo, 5, 64)

   lcStandardName = STRTRAN(lcStandardName, CHR(0), "")

 

   * lcStandardDate is a SYSTEMTIME structure, defined as follows:

   *

   *typedef struct _SYSTEMTIME {  // st

   *    WORD wYear;

   *    WORD wMonth;

   *    WORD wDayOfWeek;

   *    WORD wDay;

   *    WORD wHour;

   *    WORD wMinute;

   *    WORD wSecond;

   *    WORD wMilliseconds;

   *} SYSTEMTIME;

 

   * this SYSTEMTIME struct must be parsed again

   lcStandardDate = SUBSTR(TZInfo, 69, 16)

   lcSDYear = Str2Word(SUBSTR(lcStandardDate, 1, 2))

   lcSDMonth = Str2Word(SUBSTR(lcStandardDate, 3, 2))

   lcSDDayofWeek = Str2Word(SUBSTR(lcStandardDate, 5, 2))

   lcSDDay = Str2Word(SUBSTR(lcStandardDate, 7, 2))

   lcSDHour = Str2Word(SUBSTR(lcStandardDate, 9, 2))

   lcSDMinute = Str2Word(SUBSTR(lcStandardDate, 11, 2))

   lcSDSecond = Str2Word(SUBSTR(lcStandardDate, 13, 2))

   lcSDMSec = Str2Word(SUBSTR(lcStandardDate, 15, 2))

 

* format the standard time date for display

   lcStandardDate = PADL(LTRIM(STR(lcSDMonth, 2, 0)), 2,  "0") + "/" + ;

      PADL(LTRIM(STR(lcSDDay, 2, 0)), 2,  "0") + "/" + ;

      PADL(LTRIM(STR(lcSDYear, 2, 0)), 2, "0") + ;

      "   " + ;

      PADL(LTRIM(STR(lcSDHour, 2, 0)), 2, "0") + ":" + ;

      PADL(LTRIM(STR(lcSDMinute, 2, 0)), 2, "0") + ":" + ;

      PADL(LTRIM(STR(lcSDSecond, 2, 0)), 2, "0") + "." + ;

      PADL(LTRIM(STR(lcSDMSec, 3, 0)), 3, "0")

 

   liStandardBias = StrToLong(SUBSTR(TZInfo, 85, 4))

 

   * lcDaylightname is also a Unicode string

   lcDaylightName = SUBSTR(TZInfo, 89, 64)

   lcDaylightName = STRTRAN(lcDaylightName, CHR(0), "")

 

   * this SYSTEMTIME struct must be parsed again, same as above

   lcDaylightDate = SUBSTR(TZInfo, 153, 16)

   lcDDYear = Str2Word(SUBSTR(lcDaylightDate, 1, 2))

   lcDDMonth = Str2Word(SUBSTR(lcDaylightDate, 3, 2))

   lcDDDayofWeek = Str2Word(SUBSTR(lcDaylightDate, 5, 2))

   lcDDDay = Str2Word(SUBSTR(lcDaylightDate, 7, 2))

   lcDDHour = Str2Word(SUBSTR(lcDaylightDate, 9, 2))

   lcDDMinute = Str2Word(SUBSTR(lcDaylightDate, 11, 2))

   lcDDSecond = Str2Word(SUBSTR(lcDaylightDate, 13, 2))

   lcDDMSec = Str2Word(SUBSTR(lcDaylightDate, 15, 2))

 

   * format the daylight date for display

   lcDaylightDate = PADL(LTRIM(STR(lcDDMonth, 2, 0)), 2, "0") + "/" + ;

      PADL(LTRIM(STR(lcDDDay, 2, 0)), 2, "0") + "/" + ;

      PADL(LTRIM(STR(lcDDYear, 2, 0)), 2, "0") + ;

      "  " + ;

      PADL(LTRIM(STR(lcDDHour, 2, 0)), 2, "0") + ":" + ;

      PADL(LTRIM(STR(lcDDMinute, 2, 0)), 2, "0") + ":" + ;

      PADL(LTRIM(STR(lcDDSecond, 2, 0)), 2, "0") + "." + ;

      PADL(LTRIM(STR(lcDDMSec, 3, 0)), 3, "0")

 

   * Daylight saving time bias is a negative value

   * stored in 2s complement, so subtract 2^32 to obtain a decimal value

   liDaylightBias = StrToLong(SUBSTR(TZInfo, 169, 4)) - 2 ^ 32

 

   =MESSAGEBOX("Bias: " + LTRIM(STR(liBias)) + CR + ;

      "Standard name: " + lcStandardName + CR + ;

      "Standard date: " + lcStandardDate + CR + ;

      "Standard bias: " + LTRIM(STR(liStandardBias)) + CR + ;

      "Daylight name: " + lcDaylightName + CR + ;

      "Daylight date: " + lcDaylightDate + CR + ;

      "Daylight bias: " + LTRIM(STR(liDaylightBias)))

 

   RETURN

 

   ******************

   FUNCTION StrToLong

   ******************

   * Passed:  4-byte character string (lcLongstr) in low-high ASCII format

   * Returns:  long integer value

   * Example:

   * m.longstr = "1111"

   * m.longval = strtolong(m.longstr)

 

   PARAMETERS lcLongstr

 

   PRIVATE i, lnRetval

 

   lnRetval = 0

   FOR i = 0 TO 24 STEP 8

      lnRetval = lnRetval + (ASC(lcLongstr) * (2^i))

     lcLongstr = RIGHT(lcLongstr, LEN(lcLongstr) - 1)

   NEXT

   RETURN lnRetval

 

   **********************

   FUNCTION Str2Word

 

   PARAMETERS m.wordstr

 

   PRIVATE i, m.retval

 

   m.retval = 0

   FOR i = 0 TO 8 STEP 8

      m.retval = m.retval + (ASC(m.wordstr) * (2^i))

      m.wordstr = RIGHT(m.wordstr, LEN(m.wordstr) - 1)

   NEXT

   RETURN m.retval

 

Saludos

Armando


Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.es
Versión: 10.0.1392 / Base de datos de virus: 1520/3867 - Fecha de la versión: 30/08/2011

extremo

unread,
Aug 30, 2011, 10:58:49 AM8/30/11
to Comunidad de Visual Foxpro en Español
Yo tuve el mismo problema hace un tiempo atras con
*2011-08-29T21:57:44.232Z*

lo solucione de la sigiente forma

1 xmltocursor() : vamos a colocar como ejemplo que la cadena
*2011-08-29T21:57:44.232Z* esta creada en un campo llamado fecha

2 el xmltocursor me crea un cursor con el campo fecha en caracter

3 recorro el cursor xml

4 antes de pasar el cursor xml a la tabla hago la siguiente
transformacion para que se lea el campo de la siguiente forma:
*2011-08-29T21:57:44* . la nstrucion es : tFecha =
ctot(left(fecha,len(fecha)-5)

5 inserto en mi tabla la variable tFecha

6 Listo

Bendiciones, espero te sirva






On 30 ago, 10:38, Baltazar Moreno <bmore...@gmail.com> wrote:
> No Walter, al pasarle como parámetro la cadena con la fecha/hora, me regresa
> la hora en base al uso horario que tenga la computadora en la que se corra.
>
> Lo que requiero es convertir ese tipo de datetime (UTC) en el datetime de
> fox.
>
> Gracias!
>
> Saludos!
>
> --
> Baltazar Morenohttp://disxii.com

Intel Man

unread,
Aug 30, 2011, 11:01:44 AM8/30/11
to publice...@googlegroups.com
Pero si está sencillo, solo es cuestion de leer el codigo y ponerlo como una clase o un archivo de procedimientos y listo, solo hay que leer el codigo para entenderlo :S

Aqui está digerido, espero que esto si lo entiendas

#DEFINE TIME_ZONE_SIZE  172
DO decl
 
LOCAL cTimeZone, cTimeZone_, nId
cTimeZone = Repli(Chr(0), TIME_ZONE_SIZE)
 
? "*** Retrieving current TimeZone info..."
nId = GetTimeZoneInformation(@cTimeZone)
?ShowTimeZoneInfo(cTimeZone)
 
PROCEDURE ShowTimeZoneInfo(cTimeZone)
aux=buf2dword(SUBSTR(cTimeZone, 1,4))
return aux*60
 
FUNCTION buf2dword(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
    BitLShift(Asc(SUBSTR(lcBuffer, 2,1)),  8) +;
    BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +;
    BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)
 
FUNCTION buf2word(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
       Asc(SUBSTR(lcBuffer, 2,1)) * 256
 
FUNCTION num2dword(lnValue)
#DEFINE m0  256
#DEFINE m1  65536
#DEFINE m2  16777216
    IF lnValue < 0
        lnValue = 0x100000000 + lnValue
    ENDIF
    LOCAL b0, b1, b2, b3
    b3 = Int(lnValue/m2)
    b2 = Int((lnValue - b3*m2)/m1)
    b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
    b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
 
FUNCTION num2word(lnValue)
RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
 
PROCEDURE decl

    DECLARE INTEGER GetTimeZoneInformation IN kernel32;
        STRING @lpTimeZoneInformation
 
    DECLARE INTEGER SetTimeZoneInformation IN kernel32;
        STRING lpTimeZoneInformation
 

Saludos, y solo hay que leer el programa que se entiende por si solo, si no entiendes ya es otra cosa.

Este te devuelve el numero de segundos a restar en el datetime.



Date: Tue, 30 Aug 2011 07:27:36 -0700

From: bmor...@gmail.com
To: publice...@googlegroups.com
Subject: Re: RE: [vfp] Date Time con Uso Horario

Baltazar Moreno

unread,
Aug 30, 2011, 11:18:59 AM8/30/11
to publice...@googlegroups.com
Gracias por tu explicacion Intel, pero no obtengo el resultado deseado, ya que no ese codigo no está tomando en cuenta el horario de verano.. resta siempre 6 horas.

Se te agradece.

Baltazar Moreno

unread,
Aug 30, 2011, 11:19:51 AM8/30/11
to publice...@googlegroups.com
Gracias Extremo, pero la idea es convertirla al uso horario de la máquina que lo ejecute.. 

--
Baltazar Moreno

extremo

unread,
Aug 30, 2011, 11:35:45 AM8/30/11
to Comunidad de Visual Foxpro en Español
no te entendi Baltazar

podrias dar un ejemplo de como quieres ver el resultado para:
*2011-08-29T21:57:44.232Z* . En el ejemplo que te envie el string te
lo transforma a datetime


Bendiciones

On 30 ago, 11:19, Baltazar Moreno <bmore...@gmail.com> wrote:
> Gracias Extremo, pero la idea es convertirla al uso horario de la máquina
> que lo ejecute..
>
> --
> Baltazar Morenohttp://disxii.com

Baltazar Moreno

unread,
Aug 30, 2011, 11:50:26 AM8/30/11
to publice...@googlegroups.com
2011-08-29T21:57:44.232Z --> 2011-08-29T16:57:44

La idea sería convertirla al DT del uso horario de la máquina que ejecute el código.

En mi caso, ahorita se le restarian 5 horas, más acabado el horario de verano serían 6.

La solución que me dices.. sería lo mismo que hacer 

cFecha = "2011-08-29T21:57:44.232Z"
? ctot(left(cFecha,19))

Pero a ese DateTime, sería "2011-08-29T21:57:44"

Y no con la hora de 16... 

Gracias a todos por sus ideas, lo que terminé haciendo fue un exe en .net que recibe de parámetro la cadena a cambiar, y como segundo parámetro el nombre de un archivo en donde pongo la fecha ya convertida, el código de c# es:

string strDateTime = args[0];
string XMLRespuesta = args[1];

System.DateTime localDateTime;
try {
    localDateTime = System.DateTime.Parse(strDateTime);
}
catch (System.FormatException) {
    System.Console.WriteLine("Invalid format.");
    CreaXMLRespuesta("-1","Formato Invalido",XMLRespuesta);
    return;
}
string cFechaHora = localDateTime.Year.ToString().PadLeft(4) +"-"+localDateTime.Month.ToString().PadLeft(2)+"-"+localDateTime.Day.ToString().PadLeft(2)+"T"+localDateTime.Hour.ToString().PadLeft(2)+":"+localDateTime.Minute.ToString().PadLeft(2)+":"+localDateTime.Second.ToString().PadLeft(2);
CreaXMLRespuesta("0",cFechaHora.Replace(" ","0"),XMLRespuesta);


Saludos!

--
Baltazar Moreno

Marco Plaza

unread,
Aug 30, 2011, 11:58:13 AM8/30/11
to publice...@googlegroups.com
Hola Baltazar, usa la librería Vfp2C32 tiene la función UTC2DT  que te convierte un valor datetime UTC a la hora local, y muchas mas que te apoyan con eso.

Saludos.


Baltazar Moreno

unread,
Aug 30, 2011, 12:58:05 PM8/30/11
to publice...@googlegroups.com
Excelente Marco..

Muchas Gracias!

SET LIBRARY TO vfp2c32.fll ADDITIVE
cFecha = "2011-08-29T21:57:44.232Z"
? UTC2DT(ctot(left(cFecha,19)))

Marco Plaza

unread,
Aug 30, 2011, 1:10:16 PM8/30/11
to publice...@googlegroups.com
dale.. aquí estamos!

Norberto

unread,
Aug 30, 2011, 3:43:01 PM8/30/11
to Comunidad de Visual Foxpro en Español
No encontras informacion porque se dice: huso horario

On 29 ago, 18:59, Baltazar Moreno <bmore...@gmail.com> wrote:
> Que tal Compañeros:
>
> Un WebService me regresa una hora en éste formato:
>
> *2011-08-29T21:57:44.232Z*
>
> ¿Cómo pasarla a formato? :* 2011-08-29T16:57:44*
>
> Ojo, es convirtiendo el uso horario, no encuentro información en ningún
> lado.
>
> Gracias de antemano.
> --
> Baltazar Morenohttp://disxii.com

Baltazar Moreno

unread,
Aug 30, 2011, 4:59:21 PM8/30/11
to publice...@googlegroups.com
Tienes Razón Norberto, es Huso Horario, pero ya, gracias a la ayuda de varios compañeros del foro, he obtenido la solución. 

Saludos!

--
Baltazar Moreno
Reply all
Reply to author
Forward
0 new messages