2011-04-26 40 views
5

¿Cómo puedo convertir un formato de fecha y hora de JSON.Net tales como:fecha de conversión .NET JSON con la norma ISO

/Fecha (1154970000000 + 0700)/

Para iso ?? formato 2011-12-18T23: 34: 59Z

Preferiblemente en Python o Javascript.

He decidido sobre este último como parece en el mundo de JS el más utilizado, humanamente legible y clasificable de forma natural. Almacenaré compensaciones por usuario.

Si una implementación es demasiado pedir demasiado, si alguien puede decirme el nombre correcto para ambos formatos, podría tener más suerte para entender cómo convertir.

Respuesta

1
jsonDate = "/Date(1154970000000+0700)/"; 

var strDate = parseInt(jsonDate.replace(/\/Date\(([-\d]+).*$/, "$1")); 
var strHour = parseInt(jsonDate.replace(/.*\d([+-]\d\d).*$/, "$1"), 10); 
var strMin = parseInt(jsonDate.replace(/.*\d([+-])\d\d(\d\d).*$/, "$1$2"), 10); 

var date = new Date(strDate); 
if (!isNaN(strHour)) date.setHours(date.getHours() + strHour); 
if (!isNaN(strMin)) date.setMinutes(date.getMinutes() + strMin); 

var out = date.toISOString(); 

Y la función de convertir la norma ISO:

var toISOString = Date.prototype.toISOString ? 
    function(d){return d}: 
    (function(){ 
     function t(i){return i<10?"0"+i:i}; 
     function h(i){return i.length<2?"00"+i:i.length<3?"0"+i:3<i.length?Math.round(i/Math.pow(10,i.length-3)):i}; 
     function toISOString(){ 
      return "".concat(
       this.getUTCFullYear(), "-", 
       t(this.getUTCMonth() + 1), "-", 
       t(this.getUTCDate()), "T", 
       t(this.getUTCHours()), ":", 
       t(this.getUTCMinutes()), ":", 
       t(this.getUTCSeconds()), ".", 
       h("" + this.getUTCMilliseconds()), "Z" 
      ); 
     }; 
     return function(d){ 
      d.toISOString = toISOString; 
      return d; 
     } 
    })(); 
+0

TypeError: Objeto Mar Ago 08 de 2006 00:00:00 GMT + 0700 (TIC) no tiene un método 'formato' –

+0

lo siento, editado – ariel

+0

Mi código ignoraba el "+0700", código agregado para agregarlo a las horas/minutos de la fecha convertida. Por favor, compruebe si este es el comportamiento correcto, si no, simplemente ignore el tiempo. – ariel

2

[respuesta reemplazo]

Aquí es una versión 2.x de Python. Solo las instrucciones de impresión en la sección de prueba deben cambiarse para Python 3.x.

Por lo que puedo determinar por google: El componente principal es milisegundos desde 1970-01-01. Puede ser negativo No se espera un signo + para números positivos. Esto puede ir seguido de un desplazamiento OPCIONAL de UTC, que consta de 5 caracteres: un signo obligatorio (+ o -), 2 dígitos para las horas y 2 dígitos para los minutos. Todo lo anterior está precedido por "/ Fecha (" y seguido de ") /".

Esta respuesta proporciona una función para convertir la cadena JSON.NET a un objeto Python datetime.datetime (marca de tiempo) y 2 funciones para devolver el formato ISO truncado a segundos y milisegundos, respectivamente.

Guión:

# /Date(1154970000000+0700)/ 
#............7654321 
# without timezone: 
# /Date(1154970000000)/ 
#............21 
# dodgy case 
# /Date(-1234)/ 
#987654321 
import datetime 

def json_date_as_datetime(jd): 
    sign = jd[-7] 
    if sign not in '-+' or len(jd) == 13: 
     millisecs = int(jd[6:-2]) 
    else: 
     millisecs = int(jd[6:-7]) 
     hh = int(jd[-7:-4]) 
     mm = int(jd[-4:-2]) 
     if sign == '-': mm = -mm 
     millisecs += (hh * 60 + mm) * 60000 
    return datetime.datetime(1970, 1, 1) \ 
     + datetime.timedelta(microseconds=millisecs * 1000) 

def datetime_as_iso(dt): 
    return dt.strftime("%Y-%m-%dT%H:%M:%SZ") # truncates 

def datetime_as_iso_ms(dt): # with millisecs as fraction 
    return dt.strftime("%Y-%m-%dT%H:%M:%S.%%03dZ") \ 
     % (dt.microsecond // 1000) # truncate  

if __name__ == "__main__": 

    tests = """\ 
    /Date(1154970000000+0700)/ 
    /Date(-1234)/ 
    /Date(1000+0200)/ 
    /Date(0+0000)/ 
    /Date(0)/ 
    /Date(0-0700)/ 
    /Date(0-0730)/ 
    /Date(0-0030)/ 
    /Date(-1577923200000+0000)/ 
    /Date(1)/ 
    /Date(499)/ 
    /Date(500)/ 
    /Date(501)/ 
    /Date(999)/ 
    /Date(1000)/ 
    /Date(-1)/ 
    """.splitlines() 

    for test in tests: 
     test = test.strip() 
     if not test: continue 
     d = json_date_as_datetime(test) 
     print datetime_as_iso_ms(d), test 

Salida:

2006-08-08T00:00:00.000Z /Date(1154970000000+0700)/ 
1969-12-31T23:59:58.766Z /Date(-1234)/ 
1970-01-01T02:00:01.000Z /Date(1000+0200)/ 
1970-01-01T00:00:00.000Z /Date(0+0000)/ 
1970-01-01T00:00:00.000Z /Date(0)/ 
1969-12-31T17:00:00.000Z /Date(0-0700)/ 
1969-12-31T16:30:00.000Z /Date(0-0730)/ 
1969-12-31T23:30:00.000Z /Date(0-0030)/ 
1920-01-01T00:00:00.000Z /Date(-1577923200000+0000)/ 
1970-01-01T00:00:00.001Z /Date(1)/ 
1970-01-01T00:00:00.499Z /Date(499)/ 
1970-01-01T00:00:00.500Z /Date(500)/ 
1970-01-01T00:00:00.501Z /Date(501)/ 
1970-01-01T00:00:00.999Z /Date(999)/ 
1970-01-01T00:00:01.000Z /Date(1000)/ 
1969-12-31T23:59:59.999Z /Date(-1)/ 
+0

@mattcodes: actualizado con mejor estilo, menos errores y más pruebas :-) –

+0

json_date_as_datetime ("/ Date (1428145200000 + 1200) /") → datetime.date (2015, 4, 4, 23, 0). No lo que hace la versión JS de arriba ... –

Cuestiones relacionadas