Permalink
Browse files

Changed how dates are displayed to use a "human readable" format (1 m…

…inute ago, etc).
  • Loading branch information...
1 parent 9d025da commit 37362a4e2cb7cac9608805f0e5d7c69f2f39b6ad @omh omh committed Aug 23, 2009

Large diffs are not rendered by default.

Oops, something went wrong.

Large diffs are not rendered by default.

Oops, something went wrong.
View
@@ -0,0 +1,46 @@
+/**
+ * @file OMHHumanRedableDate.h
+ * @author Ole Morten Halvorsen
+ *
+ * @section LICENSE
+ * Copyright (c) 2009, Ole Morten Halvorsen
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ * - Neither the name of Clyppan nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+#define MINUTE_IN_SECONDS 60
+#define HOUR_IN_SECONDS (60 * MINUTE_IN_SECONDS)
+#define DAY_IN_SECONDS (24 * HOUR_IN_SECONDS)
+#define WEEK_IN_SECONDS (7 * DAY_IN_SECONDS)
+
+@interface OMHHumanReadableDate : NSObject
+{
+}
+
++ (NSString *) dateToHumanReadableString:(NSDate *)date;
++ (NSString *) dateToHumanReadableString:(NSDate *)date format:(NSString *)format;
+
+@end
View
@@ -0,0 +1,89 @@
+/**
+ * @file OMHHumanRedableDate.h
+ * @author Ole Morten Halvorsen
+ *
+ * @section LICENSE
+ * Copyright (c) 2009, Ole Morten Halvorsen
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ * - Neither the name of Clyppan nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "OMHHumanReadableDate.h"
+
+
+@implementation OMHHumanReadableDate
+
++ (NSString *) dateToHumanReadableString:(NSDate *)date
+{
+ return [self dateToHumanReadableString:date format:@"%i %@ ago"];
+}
+
++ (NSString *) dateToHumanReadableString:(NSDate *)date format:(NSString *)format
+{
+ // TODO: Add X months ago
+ NSTimeInterval secondsSinceNow = [[NSDate date] timeIntervalSinceDate:date];
+
+ NSLog( @"Seconds: %f", secondsSinceNow );
+
+ // if date less than a minute return "less than a minute ago"
+ if ( secondsSinceNow < MINUTE_IN_SECONDS )
+ return @"less than a minute ago";
+
+ NSInteger timePart = 0;
+ NSString *timeType = nil;
+ if ( secondsSinceNow <= HOUR_IN_SECONDS )
+ {
+ timeType = @"minutes";
+ timePart = (NSInteger) round( secondsSinceNow / 60 );
+ if ( timePart == 1 )
+ timeType = @"minute";
+ }
+
+ if ( secondsSinceNow <= DAY_IN_SECONDS && secondsSinceNow > HOUR_IN_SECONDS )
+ {
+ timeType = @"hours";
+ timePart = (NSInteger) round( secondsSinceNow / 3600 );
+ if ( timePart == 1 )
+ timeType = @"hour";
+ }
+
+ if ( secondsSinceNow <= WEEK_IN_SECONDS && secondsSinceNow > DAY_IN_SECONDS )
+ {
+ timeType = @"days";
+ timePart = (NSInteger) round( secondsSinceNow / ( 3600 * 24 ) );
+ if ( timePart == 1 )
+ timeType = @"day";
+ }
+
+ if ( timePart != 0 )
+ return [NSString stringWithFormat:format, timePart, timeType];
+
+
+ // if date less than a week ago return "x days ago"
+
+ return [date descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"
+ timeZone:nil
+ locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
+}
+@end
View
@@ -0,0 +1,16 @@
+//
+// OMHHumanReadableDateTest.h
+// Clyppan
+//
+// Created by Ole Morten Halvorsen on 22/08/2009.
+// Copyright 2009 __MyCompanyName__. All rights reserved.
+//
+
+#import <SenTestingKit/SenTestingKit.h>
+
+
+@interface OMHHumanReadableDateTest : SenTestCase {
+
+}
+
+@end
View
@@ -0,0 +1,105 @@
+//
+// OMHHumanReadableDateTest.m
+// Clyppan
+//
+// Created by Ole Morten Halvorsen on 22/08/2009.
+// Copyright 2009 __MyCompanyName__. All rights reserved.
+//
+
+#import "OMHHumanReadableDateTest.h"
+#import "OMHHumanReadableDate.h"
+
+@implementation OMHHumanReadableDateTest
+
+- (void) testLessThanAMinute
+{
+ NSDate *date = [NSDate date];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"less than a minute ago", @"Less than a minute ago" );
+}
+
+- (void) test59SecondsAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 59];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"less than a minute ago", @"Less than a minute ago" );
+}
+
+- (void) test1MinuteAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 60];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"1 minute ago", @"1 Minute ago" );
+}
+
+- (void) test2Minutes59secondsAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 179];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"3 minutes ago", @"2 Minutes 59 seconds ago" );
+}
+
+- (void) test3MinutesAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 180];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"3 minutes ago", @"3 Minutes ago" );
+}
+
+- (void) test59MinutesAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - (59 * 60)];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"59 minutes ago", @"59 Minutes ago" );
+}
+
+- (void) test1HourAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 3600];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"1 hour ago", @"1 hour ago" );
+}
+
+- (void) test2HoursAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - 7199];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"2 hours ago", @"2 hours ago" );
+}
+
+- (void) test1DayAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - (3600 * 24)];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"1 day ago", @"1 day ago" );
+}
+
+- (void) test2DaysAgo
+{
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:now - (2 * 3600 * 24)];
+ NSString *string = [OMHHumanReadableDate dateToHumanReadableString:date];
+
+ STAssertEqualObjects( string, @"2 days ago", @"2 days ago" );
+}
+
+
+
+@end
View
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
@@ -31,7 +31,7 @@
#import "OMHClipping.h"
-
+#import "OMHHumanReadableDate.h"
@interface OMHClipping( private )
@@ -138,11 +138,9 @@ - (NSImage *) image
- (NSString *) meta
{
- NSString *dateString = [self.created descriptionWithCalendarFormat:@"%Y-%m-%d %H:%M:%S"
- timeZone:nil
- locale:[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]];
+ NSString *dateString = [OMHHumanReadableDate dateToHumanReadableString:self.created];
- return [NSString stringWithFormat:@"Added on %@ from %@", dateString, self.createdFromApp];
+ return [NSString stringWithFormat:@"Added %@ from %@", dateString, self.createdFromApp];
}
#pragma mark -
@@ -260,7 +260,7 @@ - (void) markObjectAsCurrent:(OMHClipping *)object;
[self markObjectAsCurrentWithoutClipboard:object];
NSPasteboard *pb = [NSPasteboard generalPasteboard];
-
+
[pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
[pb setString:[self.currentActiveItem.content string] forType:NSStringPboardType];
View
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+</dict>
+</plist>

0 comments on commit 37362a4

Please sign in to comment.