Pergunta

EDIT 2009-Nov-04

OK, então tem sido um pouco desde que eu postei pela primeira vez esta questão. Parece-me que muitos dos respondentes iniciais não conseguiu realmente se o que eu estava dizendo - uma resposta comum era alguma variação em "O que você está dizendo não faz qualquer sentido" - e assim eu fiz alguns útil diagramas de realmente ilustrar meu ponto.

Quando falamos de números, que são geralmente referindo-se a pontos em que as crianças do ensino fundamental aprender é chamada de Linha Número:

O número da linha

Agora, quando aprendemos a aritmética, nossas mentes aprender a realizar uma transformação muito interessante deste conceito. Evalutating o 1 + 0.5 expressão, por exemplo, se nós simplesmente aplicamos nossa "número da linha de pensamento", exigiria que de alguma forma dar sentido a isso:

Adicionando dois pontos na linha de número

É difícil realmente ilustrar que, porque é difícil de pensam sobre isso: "acrescentar" dois pontos. Este é o lugar onde um monte de respondedores lutou com a idéia de acrescentar datas (ou simplesmente demiti-lo como um absurdo), porque eles estavam pensando em datas como pontos.

No entanto, o 1 + 0.5 expressão faz faz sentido para nós, porque quando pensamos nisso, nós realmente estamos imaginando o seguinte:

Adicionar um número (ponto) e uma magnitude (vetor)

Isto é, o número (ou ponto ) 1, mais o vector 0,5, resultando em ponto 1,5.

Como alternativa, podemos estar imaginando o seguinte:

Adicionando dois vetores

Ou seja, o vector 1, mais o vector 0,5, o que resulta em a vector 1,5.

Em outras palavras, quando se lida com números, tratamos pontos e vetores alternadamente. Mas o que sobre datas? As datas são, afinal, basicamente números. Se você não acredita em mim, comparar esta linha para a linha número acima:

Uma linha do tempo

Observe a correspondência entre a linha do tempo e a linha número? Este foi o meu ponto: se executar a transformação acima, com Números , devemos ser capazes de fazê-lo com datas bem. Assim, a aplicação de "pensamento cronograma", o 0001-Jan-02 00:00:00 + 0001-Jan-01 12:00:00 expressão não faz muito sentido, como a abundância de respondedores assinalou:

Adicionando dois pontos em uma linha do tempo

Mas , se fizermos a mesma transformação conceitual na nossa cabeça que realizamos cada vez que adicionar ou números subtrair , podemos facilmente "repensar" a acima como este :

Adicionar um ponto no tempo e um vetor de tempo

Então, claramente, a diferença entre um DateTime e uma TimeSpan é a mesma diferença que existe entre um ponto e um vector. O que acha que causou um monte de pessoas a responder negativamente a minha sugestão é que ele só se sente tão natural pensar em datas como magnitudes desta forma. Mas eu não compro o argumento de que não há nenhum ponto de referência óbvio para usar como zero. Há um ponto de referência óbvio, e eu vou lhe dar uma dica onde é:. Cerca de 2010 anos atrás

Não me entenda mal: não estou questionando a utilidade de desenhar uma divisão conceitual entre a noção de um DateTime e uma TimeSpan. Realmente, a minha pergunta o tempo todo deveria ter sido (como ChrisWindiretamente sugerido), porque não nós tratamos números e vetores alternadamente ao lidar com tipos numéricos regulares? (Ou: por que temos apenas um tipo int, em vez de int e intspan?) Há uma grande diferença, e ainda assim nós nunca realmente pensar nisso até algum tempo no colegial ou ensino médio, quando começamos geometria. E, em seguida, ela é tratada como este novo conceito matemático, quando, na realidade, é algo que temos vindo a utilizar desde que aprendi a adicionar números por contagem com nossos dedos.

No final, a melhor resposta veio de Strilanc, que apontou que o uso de DateTime e TimeSpan é realmente uma implementação de um espaço afim , que tem a propriedade conveniente de não precisar de um ponto de referência para tratar como a origem. Então, obrigado, Strilanc. Eu estou dando a resposta aceita a ChrisW, no entanto, por ser o primeiro a trazer o conceito de vetores e pontos, que realmente chegou ao cerne da questão.


pergunta original (para a posteridade)

Estou certamente não pau para toda obra de programação, mas eu sei PHP e .NET tem uma classe TimeSpan além de uma classe DateTime (ou estrutura em .NET), e eu estou supondo que este é o caso em uma variedade de outras linguagens e frameworks bem (embora eu estou escrevendo este, principalmente com referência às estruturas .NET). Isso pode parecer uma pergunta estranha, mas não é redundante TimeSpan?

No caso de você acha que a resposta é óbvia ( "A DateTime é um ponto absoluto no tempo, enquanto um TimeSpan é uma gama de tempo - simples como isso!"), Considere isto: um inteiro pode ser conceituada como qualquer um valor absoluto (o ponto na linha de número) ou uma distância entre valores - e não precisamos de dois tipos de dados separados para estas diferentes conceituações. Eu ainda pode escrever 5 + 6, sem qualquer ambiguidade quanto ao que quero dizer.

Enquanto há uma referência do ponto zero consistente, parece-me não deve haver nenhuma razão pela qual seria necessário um objeto TimeSpan para realizar operações aritméticas em objetos DateTime, ou para obter a distância entre eles.

O que eu estou ausente? Por que não podem os métodos e propriedades únicas da estrutura TimeSpan simplesmente ser dobrada em DateTime?

(Disclaimer:.. Não é como eu sou apaixonado por esta ou qualquer coisa, eu estou bem usando DateTime e TimeSpan objetos como eles estão destinados o tempo todo eu estou apenas fazendo uma pergunta)

Editar : Ok, o exemplo mais simplificada para ilustrar meu ponto:

Considere a equação 10-5 = 5. Pode-se ler isso como "Iniciar a 10 (valor), mova 5 para a esquerda (span), e você acaba em 5 (valor)"

Suponha-se, apenas para facilitar as coisas, nós deixamos 01 de janeiro de 1900 ser o ponto zero e definimos objetos TimeSpan em termos de apenas alguns dias.

Em seguida, 10-5 = 5 poderia ser entendida, em termos DateTime, como 11 de janeiro de 1900 - 06 de janeiro de 1900 = 06 de janeiro de 1900. Isso é bom, porque 11 jan é apenas "10" por nossa definição e janeiro 6 é "5" . O fato de que estamos vendo o 10 como um valor , o primeiro 5 como um espaço , e o último 5 como um valor novamente é meramente para nosso próprio benefício conceitual. Meu ponto é apenas isso: que a única diferença está em como você pensa do número, não em que ele realmente é. É por isso que não temos estruturas separadas para, digamos, inteiro valores e inteiro vãos -. Uma planície cobre inteiros antigos todas as nossas bases

Eu estou fazendo algum sentido?

Foi útil?

Solução

considerar esta: um número inteiro pode ser conceptualizado como um valor absoluto (o ponto na linha de números) ou uma distância entre os valores

Por sua lógica, não é TimeSpan que é desnecessário:. Mas sim é DateTime que é desnecessário, e poderia ser substituído por TimeSpan (duração desde zero)

Além disso, há o fato de que números inteiros têm um zero a óbvia, enquanto Datas no entanto não têm uma óbvia zero; mas ter um zero a óbvia é necessário, se você deseja substituir "lugar na linha de número" com "distância / span do / origem zero".


Editar:

Um ponto (localização num avião) não é a mesma como um vector.

Eles parecem semelhantes ...

  • Um vetor (distância da origem) pode representar um ponto
  • Um ponto (em relação à origem) pode representar um vector

... no entanto o valor do vector que é necessário para representar um determinado ponto vai mudar se as mudanças de origem.

Ele sempre faz sentido para adicionar dois vetores (relativas); mas, não faz sentido para adicionar dois pontos, exceto por converter esses pontos de vetores e, em seguida, adicionar os vetores.

A soma de dois vetores é afetado por uma mudança na origem, mas a soma de dois pontos seriam afetados por uma mudança na origem se resumiu-los, convertendo-os vetores e adicionando os vetores (porque alterar a origem afetaria os valores desses vetores).

[Substituir 'ponto' com DateTime e 'vector' com TimeSpan no argumento acima.]

Eu penso que há uma verdadeira diferença entre os valores absolutos e relativos. Eu sou não sei por que essa diferença não é mais aparente na aritmética, ou seja, por 'números' são usados ??aparentemente alternadamente para representar ambos os valores absolutos e relativos.

Outras dicas

A data não se comporta como um inteiro, eu não consigo me lembrar a classificação de álgebra de mas considere o seguinte:

Date + Span = Date
Date - Date = Span  
Date + Date = undefined

Span + Span = Span
Span - Span = Span

Para qualquer dado ano,

10 feb + 10 days = 20 feb
20 feb - 20 jan  = 31 days
20 jan + 20 feb  = ???

A última computação poderia ser interpretada como significativa quando se considera a data como Dias-desde-StartDate. Mas o valor seria tão arbitrário quanto o choiche do StartDate.

(Falando como um matemático) É porque operações aritméticas em uma "data" não são fechados ou bem definido, havendo a necessidade de uma estrutura adicional.

Por exemplo, 1º de janeiro de 2000 - 1 de dezembro de 1999 = ...? Sabemos que há 31 dias entre eles, mas se isso fosse interpretado como uma data, então a resposta é Epoch (ou seja, zero) + 31 dias. Esta não é uma "data" mais válido.

Da mesma forma, todas as operações aritméticas em números inteiros não são bem definidos (02/01 não tem resposta nas inteiros .. inteiro matemática retorna zero aqui, mas 0 * 2 = 0, e não 1 como seria de esperar). Isto implica a necessidade de uma estrutura adicional que chamamos de frações.

Só porque você pode definir uma operação não significa que você deve . Por exemplo, uma das razões divisão por zero é indefinido é porque definindo uma vez que exigiria sacrificar algumas propriedades muito úteis de aritmética (por ex. Associativity, etc).

A distinção entre um período de tempo e uma data se resume a adição. Faz sentido para adicionar dois intervalos de tempo, mas isso não faz sentido adicionar duas datas menos que tenha uma data de referência arbitrária . Ao não permitir adição de datas, você afastado abstrato que data de referência arbitrária. Eu não sei o que date '0' está na Net, e eu nunca precisava saber. Não é legal?

Adicionando duas datas é quase sempre um erro (a sério, tente pensar de onde isso faz sentido fora da numerologia). Com a introdução de intervalos de tempo (a criação de um Affine Espaço ) você elimina toda uma classe de bugs.

Uma razão é que a divisão os tipos impede uma classe de erros onde você acha que você tem um tempo relativo, mas realmente tem um tempo absoluto, e vice-versa. Por exemplo, a adição de dois tempos absolutos pode ser marcado como um erro do compilador, se os dois tipos são separados.

Além disso, IntelliSense (e descoberta para iniciantes) funciona melhor quando o número de membros é smaller-- por métodos de separação entre os dois tipos, trabalhando com cada um fica mais fácil.

Perguntado o contrário: o que teria a vantagem de enfraquecer o sistema do tipo a esse respeito ser

É tudo uma questão de custo benefício vs. e DateTime tem a grande vantagem de erros reduzindo devido a cálculos de data / hora ilógicas proibindo tais ações. existe DateTime por muito mais pelas mesmas razões que um sistema de verificação de tipo estrita existe, em primeiro lugar: a cometer erros semânticos nas mensagens de tempo de compilação produzir código. que notificar os programadores de erros em seu código.

Por outro lado, há o custo de ter DateTime:. Zilch

Agora, considere deixar cair DateTime. O que ganhamos?

Para responder à sua pergunta diretamente: “não é redundante TimeSpan?” Absolutamente não, ele reduz bugs. Ele definitivamente tem, para mim.

Pense nisso conceitualmente. Se eu te disser que eu estou tendo uma festa de 7 dias a partir de agora, é "7 dias" em que a sentença uma data. Posso apenas dizer que o meu partido é em 7 dias? Claro que não, porque a 7 dias não é uma data. Uma das ideias-chave da programação orientada a objeto é representar conceitos como este no sistema como tipos. É verdade que poderíamos representar tudo como um inteiro (e, de fato, muitas pessoas têm e fazer), mas em programação orientada a objeto, temos a noção de tipos de itens, e seus comportamentos e propriedades, e, nesse sentido, não faz sentido ter um objeto que expressa esta.

Eu acho que você poderia fazer o argumento oposto que DateTime é redundante, e nós só deve ter TimeSpan:)

A sério, todas as datas são realmente apenas a intervalos de tempo. Eles estão todos em relação a algum ponto de partida. Tecnicamente, não existe um "ano zero" no calendário cristão (desde que você não pode realmente ter um "ano zero da nosso senhor"), mas se nós atribuímos 12:00 1º de janeiro de 0001 aC como o "ponto zero", então cada data que vem depois (ou antes) pode ser pensado como em relação a essa data. Então, 00:00 em 19 de setembro de 2009 teria um TimeSpan de 734033 dias.

Assim, matematicamente , DateTime e TimeSpan são redundantes. Mas quando escrever o código, estamos a tentar comunicar muito mais do que construções matemáticas apenas abstratos. Qualquer instância DateTime pode na verdade ser apenas um período de tempo em relação a algum ponto zero arbitrário, mas a maioria das pessoas lendo o seu código, implicará um determinado ponto no calendário. Da mesma forma, um TimeSpan implica a distância entre dois pontos no calendário.

Neste caso, a Microsoft optou por ser claro em vez de parcimoniosa. Eu não posso dizer que eu discordar da decisão.

Há uma série de complicações em datas, por exemplo:

  • anos bissextos
  • segundos bissextos
  • 1582 mudanças para o calendário gregoriano
  • o fato de que não existe tal coisa como 0 anos
  • diferenças nos comprimentos de meses

Tratar Datas e TimeSpans como coisas diferentes meios que estes tipos de questões são muito menos propensos a confundi-lo na prática.

seu açúcar não mais ou menos ....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top