2010-01-27 18 views
14

Estoy tratando de tomar una cadena de fecha y convertirla en un NSDate específico (por ejemplo, el 1 de julio de 1981), pero no veo ni los métodos para establecer la fecha. ¿Alguien sabe cómo lograr esto? ¿Quizás convierta un objeto DateTime a NSDate?Crear NSDate Monotouch

Respuesta

-2

que desea buscar en la clase NSDateFormatter :)

Su código se verá algo como esto. . .

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MMM dd, yyyy HH:mm"]; 

NSDate *parsed = [formatter dateFromString:dateString]; 

S

PS Ejemplo copiado libremente de this question :)

+0

Voy a mirar en entorno la fecha usando NSDateFormatter. Monotouch no tiene todos los métodos del objetivo C, pero parece un paso en la dirección correcta. Gracias Dean – Bryan

+0

Nunca he usado monotouch, pero aparentemente NSDateFormatter está disponible en la versión 1.4.4 (http://monotouch.net/index.php?title=Releases/MonoTouch_1.4.4&highlight=NSDateFormatter). – deanWombourne

9
public static DateTime NSDateToDateTime(MonoTouch.Foundation.NSDate date) 
{ 
    return (new DateTime(2001,1,1,0,0,0)).AddSeconds(date.SecondsSinceReferenceDate); 
} 

public static MonoTouch.Foundation.NSDate DateTimeToNSDate(DateTime date) 
{ 
    return MonoTouch.Foundation.NSDate.FromTimeIntervalSinceReferenceDate((date-(new DateTime(2001,1,1,0,0,0))).TotalSeconds); 
} 

Esto debería ayudar

Alex

+4

Esto no tiene en cuenta las diferencias de zona horaria entre cómo maneja NSDate cosas y cómo lo hace datetime. – BRogers

+1

http://developer.xamarin.com/guides/cross-platform/macios/unified/#Converting_DateTime_to_NSDate – testing

24

La forma más fácil es para configurarlo de DateTime.

REVISIÓN: ¡Los operadores de conversión de NSDate ahora son explícitos, no implícitos! Actualicé el ejemplo a continuación.

Si nos fijamos en el prototipo NSDate se encuentran dos operadores:

public static explicit operator NSDate(DateTime dt); 
    public static explicit operator DateTime(NSDate d); 

Estos dos hacer la conversión para usted.

La conversión explícita de NSDate hacia y desde DateTime es bastante buena, pero debe tener en cuenta que NSDate siempre es una hora UTC y DateTime se establece por defecto en DateTimeKind.Unspecified (cuando se lee desde la base de datos) o DateTimeKind.Locale (cuando se establece con DateTime.Today). La mejor manera de convertir sin complicados cálculos de zona horaria es forzar al DateTimeKind derecha:

// Set NSDate: 
    DateTime date = DateTime.Parse("1981-07-01") 
    NSDate nsDate = (NSDate)DateTime.SpecifyKind(date, DateTimeKind.Utc); 

    // Get DateTime from NSDate: 
    date = DateTime.SpecifyKind((DateTime)nsDate, DateTimeKind.Unspecified); 
+4

Recomendaría agregar una de las siguientes líneas para asegurarse de que su conversión correctamente 'date = date.ToLocalTime();' funcionó a la perfección para mí, además de lo que has mencionado. Gracias por la guía. – BRogers

+0

'date = DateTime.SpecifyKind (nsDate, DateTimeKind.Unspecified);' Esto para mí da la fecha incorrecta –

+0

Esto funcionó muy bien para mí también. ¡Gracias! –

0
public NSDate ConvertDateTimeToNSDate(DateTime date) 
{ 
    DateTime newDate = TimeZone.CurrentTimeZone.ToLocalTime(
     new DateTime(2001, 1, 1, 0, 0, 0)); 
    return NSDate.FromTimeIntervalSinceReferenceDate(
     (date - newDate).TotalSeconds); 
} 

public DateTime ConvertNsDateToDateTime(NSDate date) 
{ 
    DateTime newDate = TimeZone.CurrentTimeZone.ToLocalTime( 
     new DateTime(2001, 1, 1, 0, 0, 0)); 
    return newDate.AddSeconds(date.SecondsSinceReferenceDate); 
} 

Fuente: https://theweeklybyte.wordpress.com/2014/05/27/convert-datetime-to-nsdate-and-back/

1

Prueba esto:

private static NSDate DateTimeToNSDate(DateTime date) 
    { 
     NSCalendar calendar = NSCalendar.CurrentCalendar; 
     NSDateComponents comps = new NSDateComponents(); 
     comps.Day = date.Day; 
     comps.Month = date.Month; 
     comps.Year = date.Year; 
     comps.Minute = date.Minute; 
     comps.Hour = date.Hour; 

     return calendar.DateFromComponents(comps); 
    }