NSDate+RFC1123.m 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //
  2. // NSDate+RFC1123.m
  3. // MKNetworkKit
  4. //
  5. // Originally created by Marcus Rohrmoser
  6. // http://blog.mro.name/2009/08/nsdateformatter-http-header/
  7. // Updated with strptime methods by Bo98
  8. //
  9. // No obvious license attached
  10. #import "NSDate+RFC1123.h"
  11. #import <time.h>
  12. #import <xlocale.h>
  13. @implementation NSDate (RFC1123)
  14. +(NSDate*)dateFromRFC1123:(NSString*)value_
  15. {
  16. if(value_ == nil)
  17. return nil;
  18. const char *str = [value_ UTF8String];
  19. const char *fmt;
  20. NSDate *retDate;
  21. char *ret;
  22. fmt = "%a, %d %b %Y %H:%M:%S %Z";
  23. struct tm rfc1123timeinfo;
  24. memset(&rfc1123timeinfo, 0, sizeof(rfc1123timeinfo));
  25. ret = strptime_l(str, fmt, &rfc1123timeinfo, NULL);
  26. if (ret) {
  27. time_t rfc1123time = mktime(&rfc1123timeinfo);
  28. retDate = [NSDate dateWithTimeIntervalSince1970:rfc1123time];
  29. if (retDate != nil)
  30. return retDate;
  31. }
  32. fmt = "%A, %d-%b-%y %H:%M:%S %Z";
  33. struct tm rfc850timeinfo;
  34. memset(&rfc850timeinfo, 0, sizeof(rfc850timeinfo));
  35. ret = strptime_l(str, fmt, &rfc850timeinfo, NULL);
  36. if (ret) {
  37. time_t rfc850time = mktime(&rfc850timeinfo);
  38. retDate = [NSDate dateWithTimeIntervalSince1970:rfc850time];
  39. if (retDate != nil)
  40. return retDate;
  41. }
  42. fmt = "%a %b %e %H:%M:%S %Y";
  43. struct tm asctimeinfo;
  44. memset(&asctimeinfo, 0, sizeof(asctimeinfo));
  45. ret = strptime_l(str, fmt, &asctimeinfo, NULL);
  46. if (ret) {
  47. time_t asctime = mktime(&asctimeinfo);
  48. return [NSDate dateWithTimeIntervalSince1970:asctime];
  49. }
  50. return nil;
  51. }
  52. -(NSString*)rfc1123String
  53. {
  54. time_t date = (time_t)[self timeIntervalSince1970];
  55. struct tm timeinfo;
  56. gmtime_r(&date, &timeinfo);
  57. char buffer[32];
  58. size_t ret = strftime_l(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S GMT", &timeinfo, NULL);
  59. if (ret) {
  60. return @(buffer);
  61. } else {
  62. return nil;
  63. }
  64. }
  65. @end