2012-04-09 15 views
9

मुझे अपने ऐप में पोस्ट की तारीख को उपयोगकर्ता को प्रदर्शित करने की ज़रूरत है, अभी मैं इसे इस प्रारूप में करता हूं: "शुक्र, 25 मई"। मैं "2 घंटे पहले" जैसे कुछ पढ़ने के लिए एनएसडीएट को कैसे प्रारूपित करूं? इसे और अधिक उपयोगकर्ता के अनुकूल बनाने के लिए।आईओएस - दोस्ताना एनएसडीएटी प्रारूप

+1

[समयावधि स्मार्ट प्रारूपण] (http://stackoverflow.com/questions/5741952/smart-formatting-of-time-span) – dasblinkenlight

+0

जांच [के संभावित डुप्लिकेट की कोशिश यह उत्तर] (http://stackoverflow.com/a/34359788/1106035) जिसमें नमूना लिंक है। –

उत्तर

8

NSDateFormatter ऐसी चीजें नहीं कर सकते हैं; आपको अपने नियम स्थापित करने की आवश्यकता होगी।

- (NSString *)formattedDate:(NSDate *)date 
{ 
    NSTimeInterval timeSinceDate = [[NSDate date] timeIntervalSinceDate:date]; 

    // print up to 24 hours as a relative offset 
    if(timeSinceDate < 24.0 * 60.0 * 60.0) 
    { 
     NSUInteger hoursSinceDate = (NSUInteger)(timeSinceDate/(60.0 * 60.0)); 

     switch(hoursSinceDate) 
     { 
       default: return [NSString stringWithFormat:@"%d hours ago", hoursSinceDate]; 
       case 1: return @"1 hour ago"; 
       case 0: 
        NSUInteger minutesSinceDate = (NSUInteger)(timeSinceDate/60.0); 
        /* etc, etc */ 
       break; 
     } 
    } 
    else 
    { 
      /* normal NSDateFormatter stuff here */ 
    } 
} 

ताकि 'मिनट एक्स पहले' तिथि, जो आमतौर पर एक दिन हो जाएगा से 24 घंटे तक प्रिंट या 'एक्स घंटे पहले' के लिए दिया गया है: मैं की तरह कुछ लगता है।

35

mattt जो भी AFNetworking बनाया द्वारा बनाया गया FormaterKit https://github.com/mattt/FormatterKit

पर एक नजर डालें।

+1

यह अयस्क अपवॉट्स प्राप्त करना चाहिए, यह एक महान डेवलपर द्वारा बनाई गई एक महान किट और इसका उपयोग करना इतना आसान है। –

3

एक लाख तरीकों से आप ऐसा कर सकता है के बारे में हैं, लेकिन यहाँ एक त्वरित एक है:

NSString* hoursAgo = [NSString stringWithFormat:@"%.0lf hours ago", fabs([date timeIntervalSinceNow]/3600.0)] 
बेशक

, इस जाँच नहीं करता है कि date अतीत से वास्तव में है, कुछ भी नहीं है लेकिन घंटे, आदि। लेकिन, आपको शायद विचार मिल जाएगा।

timeIntervalSinceNow किसी दिए गए दिनांक के बाद से कितने सेकंड बीत चुके हैं, भविष्य में सकारात्मक संख्याएं और ऋणात्मक संख्याएं अतीत में एक तिथि होने के साथ लौटती हैं। इसलिए, हमें कितने सेकंड बीत चुके हैं, पास किए गए घंटों की गणना करने के लिए इसे एक घंटे में 3600 सेकेंड तक विभाजित करें, और फिर "पूर्ण घंटे" स्ट्रिंग में अपना पूर्ण मान डालें।

4

वहाँ भी SEHumanizedTimeDiff है कि यदि आप के लिए एक मुद्दा है जो करता है/के बारे में एकाधिक भाषाओं का समर्थन करने के लिए है:

https://github.com/sarperdag/SEHumanizedTimeDiff

+1

यह एक अच्छी छोटी पुस्तकालय है, और अकेले स्थानीयकरण को एक वोट वोट देना चाहिए; चूंकि कुछ अन्य प्रस्तावित समाधानों में से कोई भी नहीं करता है। –

+1

@ करलोसपी के साथ सहमत हैं। पहले से ही बहुत सारे भाषाओं ने भी दिखने में योगदान दिया है। – djskinner

3

यहाँ (1 जनवरी एक बहुत अच्छा जवाब यह सेकंड में अवधि के बाद लगेगा, 1 9 70) और आपको '3 मिनट पहले' जैसी अच्छी प्रारूपित स्ट्रिंग वापस कर दें। सीधे शब्दों में तो जैसे अपनी तिथि वस्तु से कॉल करने की:

[timeAgoFromUnixTime:[myDateObject timeIntervalSince1970]]; 

+ (NSString *)timeAgoFromUnixTime:(double)seconds 
{ 
    double difference = [[NSDate date] timeIntervalSince1970] - seconds; 
    NSMutableArray *periods = [NSMutableArray arrayWithObjects:@"second", @"minute", @"hour", @"day", @"week", @"month", @"year", @"decade", nil]; 
    NSArray *lengths = [NSArray arrayWithObjects:@60, @60, @24, @7, @4.35, @12, @10, nil]; 
    int j = 0; 
    for(j=0; difference >= [[lengths objectAtIndex:j] doubleValue]; j++) 
    { 
     difference /= [[lengths objectAtIndex:j] doubleValue]; 
    } 
    difference = roundl(difference); 
    if(difference != 1) 
    { 
     [periods insertObject:[[periods objectAtIndex:j] stringByAppendingString:@"s"] atIndex:j]; 
    } 
    return [NSString stringWithFormat:@"%li %@%@", (long)difference, [periods objectAtIndex:j], @" ago"]; 
} 
+1

अगर यह आपको वोट देने में मदद करता है तो कृपया –

+0

अच्छा, मेरे लिए काम किया। –

+0

यह सही और छोटा और मीठा काम कर रहा है :) – iChirag

6

मैं फेसबुक की तरह एक दिनांक स्वरूप तो मैं इस NSDate श्रेणी ऊपर मार पड़ी है उनके मोबाइल एप्लिकेशन के लिए करता है चाहता था - आशा है कि यह (सामान इस तरह का होना चाहिए वास्तव में किसी के लिए उपयोगी है एक मानक पुस्तकालय में हो!) :)

https://github.com/nikilster/NSDate-Time-Ago

+0

मैं आपकी लाइब्रेरी से गुजर गया और यह बहुत उपयोगी था। लेकिन आपकी लाइब्रेरी में, "अभी अभी" जैसी चीज़ें, "6 मिनट पहले", "7 घंटे पहले" अच्छी तरह से काम करती है। लेकिन मुझे "3 दिन पहले", "4 सप्ताह पहले", "2 साल पहले" जैसी चीज़ें भी चाहिए। यह कैसे किया जाए? –

+0

यह डेट शैली की फेसबुक शैली की नकल करने के लिए बनाया गया था। यह मानव पठनीय और आसानी से समझा जा सकता है (उन्होंने इस बात का बहुत अच्छा विचार किया है कि तिथि का सबसे अच्छा प्रतिनिधित्व कैसे किया जाए और मुझे लगता है कि जब आप इसका उपयोग कर रहे हैं तो यह बहुत स्पष्ट है कि यह एक अच्छा प्रारूप है। 4 सप्ताह पहले की तरह चीजें जब आप पिछली बार अंतराल को देख रहे हों तो आपको पर्याप्त विशिष्ट जानकारी नहीं दी जाएगी। यदि आप ऐसा कुछ प्राप्त करना चाहते हैं तो बस कथन द्वारा आउटपुट वाले स्ट्रिंग को संशोधित करें। –

+0

लेकिन यह मेरी कंपनी की आवश्यकता थी और मैंने इसके बजाय भी सोचा "3 अक्टूबर को 12.42 बजे" प्रदर्शित करने के लिए, यदि मैं "1 डब्ल्यू" लिखता हूं (एक सप्ताह पहले) –

3

iOS के नवीनतम संस्करण में के बाद से यह सवाल पूछा गया था, NSDateFormatter इस क्षमता जोड़ी पड़ा है। अब यह doesRelativeDateFormatting संपत्ति का उपयोग कर कर सकता है।

+0

इसे काम पर नहीं लाया जा सकता है। चेक किए गए दस्तावेज़ और सुनिश्चित नहीं हैं कि मैं क्या गलत कर रहा हूं। अगर मैं नियमित तारीख में प्रारूपित करता हूं तो मुझे एक स्ट्रिंग मिलती है। हालांकि अगर मैं सेट करता हूं तो रिलीजडेटेडडेटफॉर्मिंग मुझे कुछ भी वापस नहीं मिलता है। विचार? कोड उदाहरण? – lostintranslation

+0

आप इसे Google का उपयोग करके कुछ ट्यूटोरियल में पा सकते हैं, लेकिन मुझे लगता है कि आपको अपना प्रश्न एक नए SO प्रश्न के रूप में पोस्ट करना चाहिए ताकि हम आपका कोड देख सकें! इसके बिना सलाह देना मुश्किल है। –

0

समाधान के लिए जोड़ा जा रहा है इस अधिक सरलीकृत विधि

NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:passed toDate:[NSDate date] options:0]; 
    NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:date]; 

    if (interval < 60) timestampString = [NSString stringWithFormat:@"%d seconds ago" ,today.second]; 
    else if (interval < 60 * 60) timestampString = [NSString stringWithFormat:@"%d minutes ago" ,today.minute]; 
    else if (interval < 60 * 60 * 24) timestampString = [NSString stringWithFormat:@"%d hours ago" ,today.hour]; 
    else timestampString = [NSString stringWithFormat:@"%d days ago" ,today.day]; 
2
+(NSString*)HourCalculation:(NSString*)PostDate 

{ 
    NSLog(@"postdate=%@",PostDate); 
    // [email protected]"2014-04-02 01:31:04"; 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
    [dateFormat setTimeZone:gmt]; 
    NSDate *ExpDate = [dateFormat dateFromString:PostDate]; 
    NSLog(@"expdate=%@",ExpDate); 
    NSLog(@"expdate=%@",[NSDate date ]); 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *components = [calendar components:(NSDayCalendarUnit|NSWeekCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit|NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:ExpDate toDate:[NSDate date] options:0]; 

// NSLog(@"year=%d",components.year); 
//  
// NSLog(@"month=%d",components.month); 
//  
// NSLog(@"week=%d",components.week); 
//  
// NSLog(@"day=%d",components.day); 
//  
// NSLog(@"hour=%d",components.hour); 
//  
// NSLog(@"min=%d",components.minute); 
//  
// NSLog(@"sce=%d",components.second); 
//  

    NSString *time; 

    if(components.year!=0) 
    { 
     if(components.year==1) 
     { 
      time=[NSString stringWithFormat:@"%ld year",(long)components.year]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld years",(long)components.year]; 
     }  
    } 
    else if(components.month!=0) 
    { 
     if(components.month==1) 
     { 
      time=[NSString stringWithFormat:@"%ld month",(long)components.month]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld months",(long)components.month]; 
     } 
     // NSLog(@"%@",time); 
    } 
    else if(components.week!=0) 
    { 
     if(components.week==1) 
     { 
      time=[NSString stringWithFormat:@"%ld week",(long)components.week]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld weeks",(long)components.week]; 
     } 
     // NSLog(@"%@",time); 
    } 
    else if(components.day!=0) 
    { 
     if(components.day==1) 
     { 
      time=[NSString stringWithFormat:@"%ld day",(long)components.day]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld days",(long)components.day]; 
     } 
    } 
    else if(components.hour!=0) 
    { 
     if(components.hour==1) 
     { 
      time=[NSString stringWithFormat:@"%ld hour",(long)components.hour]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld hours",(long)components.hour]; 
     } 
    } 
    else if(components.minute!=0) 
    { 
     if(components.minute==1) 
     { 
      time=[NSString stringWithFormat:@"%ld min",(long)components.minute]; 
     } 

     else{ 
      time=[NSString stringWithFormat:@"%ld mins",(long)components.minute]; 
     } 
     // NSLog(@"time=%@",time); 
    } 
    else if(components.second>=0){ 

     // NSLog(@"postdate=%@",PostDate); 

     // NSLog(@"expdate=%@",[NSDate date ]); 

     if(components.second==0) 
     { 
      time=[NSString stringWithFormat:@"1 sec"]; 
     } 
     else{ 
      time=[NSString stringWithFormat:@"%ld secs",(long)components.second]; 
     } 
    } 
    return [NSString stringWithFormat:@"%@ ago",time]; 

} 

इस कोड में आप समय दिखाएगा कोशिश ------------ की तरह 2 सेकंड पहले सेकंड - ----------- मिनट 2 मिनट पहले ------------ घंटे 2 घंटे पहले ------------ दिन 2 जैसे दिन पहले ------------ सप्ताह 2 सप्ताह पहले ------------ महीने 2 महीने पहले आखिरकार .... वर्ष 2 की तरह साल पहले :) इस

संबंधित मुद्दे