NSDate - Преобразуйте дату в GMT

используйте что-либо, что отвечает ===(obj) для сравнений случая:

case foo
when /baz/
  do_something_with_the_string_matching_baz
when 12..15
  do_something_with_the_integer_between_12_and_15
when lambda { |x| x % 5 == 0 }
  # only works in Ruby 1.9 or if you alias Proc#call as Proc#===
  do_something_with_the_integer_that_is_a_multiple_of_5
when Bar
  do_something_with_the_instance_of_Bar
when some_object
  do_something_with_the_thing_that_matches_some_object
end

Module (и таким образом Class), Regexp, Date, и много других классов определяют метод экземпляра: === (другой), и может все использоваться.

Благодаря Farrel для напоминания Proc#call искажаемый как Proc#=== в Ruby 1.9.

50
задан Krunal 9 January 2018 в 01:05
поделиться

5 ответов

Have you tried looking at the documentation for NSDateFormatter?

NSDateFormatter

NSDateFormatter appears to have some methods for playing with TimeZones, particularly

-setTimeZone:

I haven't tested it myself, but I imagine that if you set GMT as the timezone on a date that is originally represented in another timezone, it will display the date with the correct adjustments to match the new timezone.

3
ответ дан 7 November 2019 в 10:27
поделиться

Working with time in Cocoa can be complicated. When you get an NSDate object, it's in the local time zone. [[NSTimeZone defaultTimeZone] secondsFromGMT] gives you the offset of the current time zone from GMT. Then you can do this:

NSDate *localDate = // get the date
NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

Now gmtDate should have the correct date in GMT for you. In order to display it, look at NSDateFormatter, specifically the setDateStyle and setTimeStyle methods. You create an NSDateFormatter, configure it the way you want, and then call stringFromDate: to get a nicely formatted string.

42
ответ дан 7 November 2019 в 10:27
поделиться
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm";

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateFormatter setTimeZone:gmt];
    NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    [dateFormatter release];
132
ответ дан 7 November 2019 в 10:27
поделиться

Хотя ответ Алекса был хорошим началом, он не касался летнего времени (летнее время) и добавил ненужное преобразование в / из контрольной даты. У меня работает следующее:

Для преобразования даты localDate в GMT с учетом DST:

NSDate *localDate = <<your local date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:localDate];
NSDate *gmtDate = [localDate dateByAddingTimeInterval:-timeZoneOffset]; // NOTE the "-" sign!

Для преобразования даты GMT в localDate с учетом DST:

NSDate *gmtDate  = <<your gmt date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:gmtDate];
NSDate *localDate = [gmtDate dateByAddingTimeInterval:timeZoneOffset];

Одно небольшое примечание: я использовал dateByAddingTimeInterval , а это только iOS 4. Если вы используете OS 3 или более раннюю версию, используйте addTimerInterval.

5
ответ дан 7 November 2019 в 10:27
поделиться

Ответ Ховарда правильный, проголосуйте за него и примите его.

Для справки, я думаю, полезно объяснить разницу между объектами даты и локализованными представлениями даты.

Во многих языках программирования объекты даты используются для представления уникальных моментов времени. Игнорируя релятивистские аргументы, можно предположить, что в любой момент мы можем определить момент времени, который универсально одинаков для всех, независимо от того, как мы измеряем время.

Если бы для каждого момента времени мы могли создать уникальную метку, эту метку можно было бы передать и указать однозначно. Назначение объектов даты - действовать как уникальная универсальная метка для данного момента времени .

Можно придумать любое количество методов для построения такой схемы маркировки, и то, как каждый объект даты выбирает для этого, не имеет значения для любого, кто их использует.

Примером может быть использование числового смещения от универсального события ( X секунд с момента взрыва солнца ).

Только когда мы хотим взять момент времени и преобразовать его в удобочитаемую строку, мы должны иметь дело со сложностями часовых поясов, локалей и т. Д.

( Local Date String ) + ( Средство форматирования даты ) => Точка времени

Точка времени + ( Средство форматирования даты ) => ( Строка локальной даты )

Каждая временная точка универсальна ... не существует такой вещи, как нью-йоркская временная точка или временная точка gmt , только после того, как вы конвертируете временную точку в локальную строку (используя средство форматирования даты) появляется ли какая-либо связь с часовым поясом.

Примечание: я уверен, что есть много блогов / статей по этой самой проблеме, но мой google foo терпит неудачу в этот час. Если у кого-то есть энтузиазм, чтобы подробно остановиться на этом вопросе, пожалуйста, сделайте это.

16
ответ дан 7 November 2019 в 10:27
поделиться