Что мы должны сделать, чтобы подготовиться к 2038 году?

StackOverflow https://stackoverflow.com/questions/36239

Вопрос

Я хотел бы думать, что некоторые из программного обеспечения, которое я пишу сегодня, будет использоваться за 30 лет. Но я также знаю, что многое из этого основано на традиции UNIX, чтобы разоблачить время как количество секунд с 1970 года.

#include <stdio.h>
#include <time.h>
#include <limits.h>

void print(time_t rt) {
    struct tm * t = gmtime(&rt);
    puts(asctime(t));
}

int main() {
    print(0);
    print(time(0));
    print(LONG_MAX);
    print(LONG_MAX+1);
}

Результаты исполнения:

  • Чт 1 января 00:00:00 1970
  • Сб 30 августа 18:37:08 2008
  • Вторник 19 января 03:14:07 2038
  • Пт 13 декабря 20:45:52 1901

Функции ctime (), gmtime () и localtime () - все это принимает в качестве аргумента ценность времени, представляющего время в секундах после эпохи (00:00:00 UTC, 1 января 1970 года; см. Время (3)).

Интересно, есть ли что -нибудь упреждающее в этой области как программист, или мы должны верить, что все программные системы (он же операционные системы) будут некоторыми, насколько магически обновляются в будущем?

Обновлять Казалось бы, действительно 64-битные системы безопасны от этого:

import java.util.*;

class TimeTest {
    public static void main(String[] args) {
        print(0);
        print(System.currentTimeMillis());
        print(Long.MAX_VALUE);
        print(Long.MAX_VALUE + 1);
    }

    static void print(long l) {
        System.out.println(new Date(l));
    }
}
  • Ср 31 декабря 16:00:00 PST 1969
  • Сб 30 августа 12:02:40 PDT 2008
  • Сб 16 августа 23:12:55 PST 292278994
  • Солнце 02 декабря 08:47:04 PST 292269055

Но как насчет года 292278994?

Это было полезно?

Решение

Я написал портативную замену для времени. H (в настоящее время только localtime (), gmtime (), mktime () и timegm ()), в котором используется 64 -битное время даже на 32 -битных машинах. Он предназначен для того, чтобы быть сброшенным в проекты C в качестве замены на время. Он используется в Perl, и я намерен исправить проблемы Ruby и Python 2038 с ним. Это дает вам безопасный диапазон +/- 292 миллиона лет.

Вы можете найти код в проекте Y2038. Полем Пожалуйста, не стесняйтесь размещать любые вопросы в выпуск трекер.

Что касается «это не будет проблемой еще 29 лет», просмотрите это Список стандартных ответов к тому, что. Короче говоря, вещи произойдут в будущем, и иногда вам нужно знать, когда. у меня тоже есть Презентация по проблеме, что не является решением, а что.

О, и не забывайте, что много времени систем не обрабатывают даты до 1970 года. Вещи случались до 1970 года, иногда вам нужно знать, когда.

Другие советы

Вы всегда можете реализовать RFC 2550 и будьте в безопасности навсегда ;-)

У известной вселенной есть конечное прошлое и будущее. Текущий возраст вселенной оценивается в [Zebu] как между 10 ** 10 и 2 * 10 ** 10 лет. Смерть вселенной оценивается в [Найджел], которая произойдет в 10 ** 11 - годах и в [Дрейке], как это происходит в 10 ** 12 лет для закрытой вселенной (большой хруст) или 10 ** 14 лет для Открытая вселенная (тепловая смерть вселенной).

 

Программы соответствия Y10K могут выбрать ограничение диапазона дат, которые они поддерживают, соответствующими ожидаемой жизни вселенной. Системы, соответствующие Y10K, должны принимать даты 10 тысяч Y10K от 10 ** 12 лет до 10 ** 20 лет до будущего. Системы, соответствующие Y10K, должны принимать даты не менее 10 ** 29 лет в прошлом и будущем.

Visual Studio перешла к 64 -битному представлению Time_t в Visual Studio 2005 (в то же время оставив _time32_t для обратной совместимости).

Пока вы стараетесь всегда писать код с точки зрения Time_t и не предполагайте ничего в размере, когда SysRQB указывает, что проблема будет решена вашим компилятором.

Я думаю, что мы должны оставить ошибку. Тогда около 2036 года мы можем начать продавать консалтинговые условия для больших сумм денег, чтобы проверить все. В конце концов, не так ли, как мы успешно управляли переносом 1999-2000 гг.

Я всего лишь шучу!

Я сидел в банке в Лондоне в 1999 году и был очень удивлен, когда увидел, как консультант начал Y2K, тестирующую кофемашину. Я думаю, что если мы узнали что -нибудь из этого фиаско, это было то, что подавляющее большинство программного обеспечения будет работать просто, а большинство остальных не вызовут расплав, если оно не удастся, и может быть исправлено после события, если это необходимо. Таким образом, я бы не стал принять никаких особых мер предосторожности, пока намного ближе к времени.

Учитывая мой возраст, я думаю, что я должен много заплатить за свою пенсию и заплатить за все мои депета, чтобы кто -то другой должен был соответствовать программному обеспечению!

Извините, если вы подумаете о «чистой приведенной стоимости» любого программного обеспечения, которое вы пишете сегодня, оно не влияет на то, что программное обеспечение делает в 2038 году. «Возврат инвестиций» более чем на несколько лет является необычным для любого программного проекта, поэтому, поэтому Вы зарабатываете гораздо больше денег для своего работодателя, предлагая программное обеспечение быстрее, вместо того, чтобы думать, что намного впереди.

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

Сохраняйте хорошую документацию и включите описание ваших зависимостей. Я не думаю, что многие люди думали о том, насколько тяжелым может быть этот переход, например, http cookie собирается сломаться в эту дату.

Что мы должны сделать, чтобы подготовиться к 2038 году?

Скрыть, потому что апокалипсис идет.

А если серьезно, я надеюсь, что компиляторы (или люди, которые их пишут, точнее,) могут справиться с этим. У них почти 30 лет. Я надеюсь, что это достаточно времени.

В какой момент мы начинаем готовиться к Y10K? Были ли какие -либо производители оборудования / исследовательские лаборатории проще всего перейти на любую новую технологию, которую мы должны иметь из -за этого?

Я работаю в Embedded и подумал, что опубликую наше решение здесь. Наши системы находятся на 32 битах, и то, что мы продаем сейчас, имеет 30 -летний варан, что означает, что они столкнутся с ошибкой 2038 года. Обновление в будущем не было решением.

Чтобы исправить это, мы установили дату ядра 28 лет назад, что текущая дата. Это не случайное смещение, 28 лет - это время, которое потребуется на дни недели, чтобы снова совпадать. Например, я пишу это в четверг, и в следующий раз, когда 7 марта будет четверг, будет за 28 лет.

Кроме того, все приложения, которые взаимодействуют с датами в наших системах, будут принимать системную дату (Time_t) преобразовать его в пользовательское время 64_T и применить 28 -летнее смещение на правильную дату.

Мы сделали пользовательскую библиотеку, чтобы справиться с этим. Код, который мы используем, основан на этом: https://github.com/android/platform_bionic

Таким образом, с помощью этого решения вы можете легко купить себе дополнительные 28 лет.

К 2038 году библиотеки времени должны использовать 64-разрядные целые числа, так что на самом деле это не будет такой важной сделкой (на программном обеспечении, которое не совсем не связано).

Программы COBOL могут быть веселыми, хотя.

Оперативное слово «должно».

Если вам нужно обеспечить FuturePraiting, то вы можете построить свой собственный класс даты/времени и использовать это, но я бы сделал это, только если вы думаете, что то, что вы пишете, будет использоваться в Legacy OS '

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top