| Hora de inicio | ID de agente |
|---|---|
| 19/08/2021 07:04:56 a. m. UTC | 33 |
| 11/08/2021 14:58:35 CST | 42 |
| 12/08/2021 01:01:51 CST | 24 |
| 12/08/2021 08:52:34 p. m. UTC | 61 |
public class MyModel { public string StartTime { get; set; } public int AgentId { get; set; } public string TimeZone { get; set; } public string Time { get; set; } } Tengo el modelo de clase C# MyModel y sus datos de muestra almacenados como List<MyModel> en mi lógica. Necesito ayuda para analizar el campo StartTime de inicio de una lista de modo que el campo TimeZone horaria obtenga el UTC/CST/IST de su Hora de StartTime correspondiente y el campo Time de una lista debe tener una marca de tiempo de su StartTime de inicio, es decir: 07:04:56 o 02:58:35 y así sucesivamente. Finalmente, la lista debería parecerse a algo como a continuación:
| Hora de inicio | ID de agente | Hora | Zona horaria |
|---|---|---|---|
| 19/08/2021 07:04:56 a. m. UTC | 33 | 07:04:56 a. m. | UTC |
| 11/08/2021 14:58:35 CST | 42 | 14:58:35 | IST |
| 12/08/2021 01:01:51 CST | 24 | 01:01:51 a. m. | CST |
| 12/08/2021 08:52:34 p. m. UTC | 61 | 20:52:34 | UTC |
Dado el hecho de que todos los segmentos en su propiedad StartTime tienen una cantidad forzada de caracteres gracias al formato de cadena que ha elegido (excepto la zona horaria donde podríamos tener, por ejemplo, CEST, pero no tenemos que preocuparnos por eso y yo llegaremos al por qué en solo un segundo) podemos simplemente usar el método String.Substring y para el primer parámetro, definir el carácter desde donde debe comenzar a leerse la nueva cadena que se va a generar y como segundo parámetro, la cantidad de caracteres debe leer de allí en adelante. Si no configuramos el segundo parámetro, el método String.Substring simplemente leerá la cadena hasta el final y dado que la zona horaria es el último segmento del formato StartTime , la cantidad desconocida de caracteres para la zona horaria no es un problema para nosotros.
Con eso en mente, aquí hay algunas opciones que puede elegir:
Si no desea ajustar su clase:
private void ManageMyModels(List<MyModel> models) { models.ForEach(model => { model.TimeZone = model.StartTime.Substring(23); model.Time = model.StartTime.Substring(11, 11); }); } Esta solución es bastante simple, ya que itera sobre cada elemento de MyModel y establece los valores de las propiedades TimeZone y Time de acuerdo con el valor de StartTime . Sin embargo, sería mucho mejor si no tuviéramos que hacer esto manualmente para cada modelo que creamos, así que aquí hay una mejor solución si no te importa ajustar tu clase :
public class MyModel { public string StartTime { get; set; } public int AgentId { get; set; } public string TimeZone => this.StartTime.Substring(23); public string Time => this.StartTime.Substring(11, 11); } La forma en que funciona esta solución es que cada vez que acceda a la propiedad TimeZone o Time , su código asignado se ejecutará devolviendo la subcadena que necesita. En cuanto al rendimiento, habría una desventaja en la que el código se ejecutaría cada vez que llame a cualquiera de las propiedades, incluso cuando el valor de StartTime no haya cambiado.
Alternativamente, podría hacerlo al revés, donde cada vez que pase un nuevo valor a StartTime, ambas propiedades también se actualizarían:
public class MyModel { private string _startTime; public string StartTime { get => _startTime; set { this._startTime = value; this.TimeZone = value.Substring(23); this.Time = value.Substring(11, 11); } } public int AgentId { get; set; } public string TimeZone { get; private set; } public string Time { get; private set; } } Esto elimina la desventaja mencionada anteriormente, pero crea una nueva en la que la propiedad TimeZone y Time siempre se actualizarán cada vez que se actualice la propiedad StartTime, incluso si no la usaría.
Personalmente, me quedaría con la opción anterior simplemente porque es más corta y fácil de leer.