Lo tengo resuelto para mis propósitos. Resumiré lo que aprendí (lo siento, estas notas son detalladas; son tanto para mi futura referencia como cualquier otra cosa).
Contrariamente a lo que dije en uno de mis comentarios anteriores, los campos de fecha y hora y TIMESTAMP no se comportan de manera diferente. Los campos TIMESTAMP (como indican los documentos) toman todo lo que les envíe en formato "AAAA-MM-DD hh: mm: ss" y conviértalo de su zona horaria actual a la hora UTC. Lo contrario ocurre de forma transparente cada vez que recupera los datos. Los campos DATETIME no realizan esta conversión. Toman todo lo que les envíes y lo almacenan directamente.
Ni los tipos de campo DATETIME ni TIMESTAMP pueden almacenar datos con precisión en una zona horaria que respete el horario de verano . Si almacena "2009-11-01 01:30:00", los campos no tienen forma de distinguir qué versión de la 1:30 am deseaba: la versión -04: 00 o -05: 00.
Ok, entonces debemos almacenar nuestros datos en una zona horaria que no sea DST (como UTC). Los campos TIMESTAMP no pueden manejar estos datos con precisión por las razones que explicaré: si su sistema está configurado en una zona horaria DST, entonces lo que ingresa en TIMESTAMP puede que no sea lo que obtiene. Incluso si le envía datos que ya ha convertido a UTC, seguirá asumiendo que los datos están en su zona horaria local y hará otra conversión a UTC. Este viaje de ida y vuelta local-a-UTC-back-to-local aplicado por TIMESTAMP tiene pérdidas cuando la zona horaria local observa el horario de verano (ya que "2009-11-01 01:30:00" se asigna a 2 horas posibles diferentes).
Con DATETIME puede almacenar sus datos en cualquier zona horaria que desee y estar seguro de que recibirá lo que envíe (no se verá obligado a realizar las conversiones de ida y vuelta con pérdidas que los campos TIMESTAMP le imponen). Entonces, la solución es usar un campo DATETIME y antes de guardar en el campo, convierta la zona horaria de su sistema en cualquier zona que no sea DST en la que desee guardarlo (creo que UTC es probablemente la mejor opción). Esto le permite crear la lógica de conversión en su lenguaje de secuencias de comandos para que pueda guardar explícitamente el equivalente UTC de "2009-11-01 01:30:00 -04: 00" o "" 2009-11-01 01:30: 00-05: 00 ".
Otra cosa importante a tener en cuenta es que las funciones matemáticas de fecha / hora de MySQL no funcionan correctamente alrededor de los límites DST si almacena sus fechas en un DST TZ. Así que una razón de más para ahorrar en UTC.
En pocas palabras, ahora hago esto:
Al recuperar los datos de la base de datos:
Interprete explícitamente los datos de la base de datos como UTC fuera de MySQL para obtener una marca de tiempo Unix precisa. Utilizo la función strtotime () de PHP o su clase DateTime para esto. No se puede hacer de manera confiable dentro de MySQL usando las funciones CONVERT_TZ () o UNIX_TIMESTAMP () de MySQL porque CONVERT_TZ solo generará un valor 'YYYY-MM-DD hh: mm: ss' que sufre problemas de ambigüedad, y UNIX_TIMESTAMP () asume su La entrada está en la zona horaria del sistema, no en la zona horaria en la que los datos se almacenaron REALMENTE (UTC).
Al almacenar los datos en la base de datos:
Convierta su fecha a la hora UTC precisa que desee fuera de MySQL. Por ejemplo: con la clase DateTime de PHP puede especificar "2009-11-01 1:30:00 EST" de forma distinta a "2009-11-01 1:30:00 EDT", luego convertirlo a UTC y guardar la hora UTC correcta. a su campo DATETIME.
Uf. Muchas gracias por el aporte y la ayuda de todos. Con suerte, esto le ahorrará a alguien más dolores de cabeza en el futuro.
Por cierto, estoy viendo esto en MySQL 5.0.22 y 5.0.27