Obtenir le NSDate actuel au format d'horodatage

83

J'ai une méthode de base qui obtient l'heure actuelle et la définit dans une chaîne. Cependant, comment puis-je le faire formater la date et l'heure actuelles dans un format d'horodatage UNIX depuis 1970?

Voici mon code:

NSDate *currentTime = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"hh-mm"];
NSString *resultString = [dateFormatter stringFromDate: currentTime];

Est-il possible d'utiliser NSDateFormatterpour changer le 'resultString' en un horodatage?

Supertecnoboff
la source

Réponses:

216

Voici ce que j'utilise:

NSString * timestamp = [NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970] * 1000];

(multiplié par 1000 pour les millisecondes, sinon, retirez-le)

Si vous l'utilisez tout le temps, il peut être intéressant de déclarer une macro

#define TimeStamp [NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970] * 1000]

Alors appelez-le comme ceci:

NSString * timestamp = TimeStamp;

Ou comme méthode:

- (NSString *) timeStamp {
    return [NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970] * 1000];
}

Comme TimeInterval

- (NSTimeInterval) timeStamp {
    return [[NSDate date] timeIntervalSince1970] * 1000;
}

REMARQUE:

Le 1000 est de convertir l'horodatage en millisecondes. Vous pouvez le supprimer si vous préférez votre timeInterval en secondes.

Rapide

Si vous souhaitez une variable globale dans Swift, vous pouvez utiliser ceci:

var Timestamp: String {
    return "\(NSDate().timeIntervalSince1970 * 1000)"
}

Ensuite, vous pouvez l'appeler

println("Timestamp: \(Timestamp)")

Encore une fois, le *1000est pour les millisecondes, si vous préférez, vous pouvez le supprimer. Si vous voulez le garder comme unNSTimeInterval

var Timestamp: NSTimeInterval {
    return NSDate().timeIntervalSince1970 * 1000
}

Déclarez-les en dehors du contexte de toute classe et ils seront accessibles n'importe où.

Logan
la source
2
Pas de problème, j'ai mis à jour avec la macro que j'utilise au cas où cela serait utile pour votre situation!
Logan
3
Merci @Logan mais je suis sûr que les macros sont toujours découragées. Vous pouvez facilement perdre la compréhension d'un gros programme avec des macros. Il serait préférable de créer une méthode qui le fasse et qui soit appelée chaque fois que vous en avez besoin.
Supertecnoboff
BTW - si vous ajoutez la valeur à un dictionnaire, vous pouvez simplement faire:@{@"timestamp": @([[NSDate date] timeIntervalSince1970])
Cbas
15

utilisation [[NSDate date] timeIntervalSince1970]

sage444
la source
8
@([[NSDate date] timeIntervalSince1970]).stringValue
mattsven
7
- (void)GetCurrentTimeStamp
    {
        NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
        [objDateformat setDateFormat:@"yyyy-MM-dd"];
        NSString    *strTime = [objDateformat stringFromDate:[NSDate date]];
        NSString    *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
        NSDate *objUTCDate  = [objDateformat dateFromString:strUTCTime];
        long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);

        NSString *strTimeStamp = [NSString stringWithFormat:@"%lld",milliseconds];
NSLog(@"The Timestamp is = %@",strTimeStamp);
    }

 - (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSDate  *objDate    = [dateFormatter dateFromString:IN_strLocalTime];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *strDateTime   = [dateFormatter stringFromDate:objDate];
        return strDateTime;
    }

REMARQUE: - L'horodatage doit être dans la zone UTC, donc je convertis notre heure locale en heure UTC.

Vicky
la source
votre GetCurrentTimeStamp () a quelques problèmes en minuscules. couper et coller dans Xcode pour voir
tdios
Veuillez utiliser ceci "NSString * strTimeStamp = [NSString stringWithFormat: @"% lld ", millisecondes]; NSLog (@" The Timestamp is =% @ ", strTimeStamp);"
Vicky
6

Si vous souhaitez appeler cette méthode directement sur un objet NSDate et obtenir l'horodatage sous forme de chaîne en millisecondes sans décimales, définissez cette méthode comme une catégorie:

@implementation NSDate (MyExtensions)
- (NSString *)unixTimestampInMilliseconds
{
     return [NSString stringWithFormat:@"%.0f", [self timeIntervalSince1970] * 1000];
}
Pastille
la source
1

// La méthode suivante vous renvoie l'horodatage après la conversion en millisecondes. [RETURNS STRING]

- (NSString *) timeInMiliSeconds
{
    NSDate *date = [NSDate date];
    NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
    return timeInMS;
}
Fatima Arshad
la source
1

Peut également utiliser

@(time(nil)).stringValue);

pour l'horodatage en secondes.

Rubik
la source
1

Il est pratique de définir une macro pour obtenir l'horodatage actuel

class Constant {
    struct Time {
        let now = { round(NSDate().timeIntervalSince1970) } // seconds
    }
} 

Ensuite, vous pouvez utiliser let timestamp = Constant.Time.now()

Alston
la source
0

Rapide:

J'ai un UILabel qui montre TimeStamp sur un aperçu de la caméra.

    var timeStampTimer : NSTimer?
    var dateEnabled:  Bool?
    var timeEnabled: Bool?
   @IBOutlet weak var timeStampLabel: UILabel!

override func viewDidLoad() {
        super.viewDidLoad()
//Setting Initial Values to be false.
        dateEnabled =  false
        timeEnabled =  false
}

override func viewWillAppear(animated: Bool) {

        //Current Date and Time on Preview View
        timeStampLabel.text = timeStamp
        self.timeStampTimer = NSTimer.scheduledTimerWithTimeInterval(1.0,target: self, selector: Selector("updateCurrentDateAndTimeOnTimeStamperLabel"),userInfo: nil,repeats: true)
}

func updateCurrentDateAndTimeOnTimeStamperLabel()
    {
//Every Second, it updates time.

        switch (dateEnabled, timeEnabled) {
        case (true?, true?):
            timeStampLabel.text =  NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .LongStyle, timeStyle: .MediumStyle)
            break;
        case (true?, false?):
            timeStampLabel.text = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .LongStyle, timeStyle: .NoStyle)
            break;

        case (false?, true?):
            timeStampLabel.text = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .MediumStyle)
            break;
        case (false?, false?):
            timeStampLabel.text =  NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .NoStyle)
            break;
        default:
            break;

        }
    }

Je suis en train de configurer un bouton de réglage pour déclencher une alerteView.

@IBAction func settingsButton(sender : AnyObject) {


let cameraSettingsAlert = UIAlertController(title: NSLocalizedString("Please choose a course", comment: ""), message: NSLocalizedString("", comment: ""), preferredStyle: .ActionSheet)

let timeStampOnAction = UIAlertAction(title: NSLocalizedString("Time Stamp on Photo", comment: ""), style: .Default) { action in

    self.dateEnabled = true
    self.timeEnabled =  true

}
let timeStampOffAction = UIAlertAction(title: NSLocalizedString("TimeStamp Off", comment: ""), style: .Default) { action in

    self.dateEnabled = false
    self.timeEnabled =  false

}
let dateOnlyAction = UIAlertAction(title: NSLocalizedString("Date Only", comment: ""), style: .Default) { action in

    self.dateEnabled = true
    self.timeEnabled =  false


}
let timeOnlyAction = UIAlertAction(title: NSLocalizedString("Time Only", comment: ""), style: .Default) { action in

    self.dateEnabled = false
    self.timeEnabled =  true
}

let cancel = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel) { action in

}
cameraSettingsAlert.addAction(cancel)
cameraSettingsAlert.addAction(timeStampOnAction)
cameraSettingsAlert.addAction(timeStampOffAction)
cameraSettingsAlert.addAction(dateOnlyAction)
cameraSettingsAlert.addAction(timeOnlyAction)

self.presentViewController(cameraSettingsAlert, animated: true, completion: nil)

}

AG
la source
0
    NSDate *todaysDate = [NSDate new];
NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setDateFormat:@"MM-dd-yyyy HH:mm:ss"];
NSString *strDateTime = [formatter stringFromDate:todaysDate];

NSString *strFileName = [NSString stringWithFormat:@"/Users/Shared/Recording_%@.mov",strDateTime];
NSLog(@"filename:%@",strFileName);

Le journal sera: nom de fichier: / Users / Shared / Recording_06-28-2016 12: 53: 26.mov

jiten
la source
0

Si vous avez besoin d'un horodatage sous forme de chaîne.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
nanjunda
la source
0

Pour obtenir l'horodatage de NSDate Swift 3

func getCurrentTimeStampWOMiliseconds(dateToConvert: NSDate) -> String {
    let objDateformat: DateFormatter = DateFormatter()
    objDateformat.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let strTime: String = objDateformat.string(from: dateToConvert as Date)
    let objUTCDate: NSDate = objDateformat.date(from: strTime)! as NSDate
    let milliseconds: Int64 = Int64(objUTCDate.timeIntervalSince1970)
    let strTimeStamp: String = "\(milliseconds)"
    return strTimeStamp
}

Utiliser

let now = NSDate()
let nowTimeStamp = self.getCurrentTimeStampWOMiliseconds(dateToConvert: now)
Hardik Thakkar
la source