タイムゾーン・時刻の種類に関するオプションのうち、AssumeLocalおよびAssumeUniversalは文字列中の日時がどのタイムゾーンも表さない場合にローカル時刻もしくはUTCと見なすように指定するオプションです。 当然、オフセット値が指定されている場合は、その値が使用されます。

DateTime/DateTimeOffset.ParseExactメソッドでDateTimeStylesを指定し、時刻をローカル時刻またはUTCとみなして変換する
Imports System
Imports System.Globalization

Class Sample
  Shared Sub Main()
    Dim inputs() As String = New String() { _
      "2013-04-01T15:00:30.1234567", _
      "2013-04-01T15:00:30.1234567+00:00", _
      "2013-04-01T15:00:30.1234567+09:00", _
      "2013-04-01T15:00:30.1234567-05:00" _
    }
    Dim styles() As DateTimeStyles = New DateTimeStyles() { _
      DateTimeStyles.None, _
      DateTimeStyles.AssumeLocal, _
      DateTimeStyles.AssumeUniversal _
    }

    ' 文字列をDateTimeへ変換
    Console.WriteLine("DateTime.ParseExact")
    For Each input As String In inputs
      For Each style As DateTimeStyles In styles
        Dim dt As DateTime = DateTime.ParseExact(input, "o", Nothing, style)

        Console.WriteLine("{0,-35} ({1,-15}) -> {2} ({3})", input, style, dt, dt.Kind)
      Next
      Console.WriteLine()
    Next
    Console.WriteLine()

    ' 文字列をDateTimeOffsetへ変換
    Console.WriteLine("DateTimeOffset.ParseExact")
    For Each input As String In inputs
      For Each style As DateTimeStyles In styles
        Try
          Dim dto As DateTimeOffset = DateTimeOffset.ParseExact(input, "o", Nothing, style)

          Console.WriteLine("{0,-35} ({1,-15}) -> {2}", input, style, dto)
        Catch ex As FormatException
          Console.WriteLine("{0,-35} ({1,-15}) -> (FormatException)", input, style)
        End Try
      Next
      Console.WriteLine()
    Next
    Console.WriteLine()
  End Sub
End Class
UTC+9の環境での実行結果例
DateTime.ParseExact
2013-04-01T15:00:30.1234567         (None           ) -> 2013/04/01 15:00:30 (Unspecified)
2013-04-01T15:00:30.1234567         (AssumeLocal    ) -> 2013/04/01 15:00:30 (Local)
2013-04-01T15:00:30.1234567         (AssumeUniversal) -> 2013/04/02 0:00:30 (Local)

2013-04-01T15:00:30.1234567+00:00   (None           ) -> 2013/04/02 0:00:30 (Local)
2013-04-01T15:00:30.1234567+00:00   (AssumeLocal    ) -> 2013/04/02 0:00:30 (Local)
2013-04-01T15:00:30.1234567+00:00   (AssumeUniversal) -> 2013/04/02 0:00:30 (Local)

2013-04-01T15:00:30.1234567+09:00   (None           ) -> 2013/04/01 15:00:30 (Local)
2013-04-01T15:00:30.1234567+09:00   (AssumeLocal    ) -> 2013/04/01 15:00:30 (Local)
2013-04-01T15:00:30.1234567+09:00   (AssumeUniversal) -> 2013/04/01 15:00:30 (Local)

2013-04-01T15:00:30.1234567-05:00   (None           ) -> 2013/04/02 5:00:30 (Local)
2013-04-01T15:00:30.1234567-05:00   (AssumeLocal    ) -> 2013/04/02 5:00:30 (Local)
2013-04-01T15:00:30.1234567-05:00   (AssumeUniversal) -> 2013/04/02 5:00:30 (Local)


DateTimeOffset.ParseExact
2013-04-01T15:00:30.1234567         (None           ) -> 2013/04/01 15:00:30 +09:00
2013-04-01T15:00:30.1234567         (AssumeLocal    ) -> 2013/04/01 15:00:30 +09:00
2013-04-01T15:00:30.1234567         (AssumeUniversal) -> 2013/04/01 15:00:30 +00:00

2013-04-01T15:00:30.1234567+00:00   (None           ) -> 2013/04/01 15:00:30 +00:00
2013-04-01T15:00:30.1234567+00:00   (AssumeLocal    ) -> 2013/04/01 15:00:30 +00:00
2013-04-01T15:00:30.1234567+00:00   (AssumeUniversal) -> 2013/04/01 15:00:30 +00:00

2013-04-01T15:00:30.1234567+09:00   (None           ) -> 2013/04/01 15:00:30 +09:00
2013-04-01T15:00:30.1234567+09:00   (AssumeLocal    ) -> 2013/04/01 15:00:30 +09:00
2013-04-01T15:00:30.1234567+09:00   (AssumeUniversal) -> 2013/04/01 15:00:30 +09:00

2013-04-01T15:00:30.1234567-05:00   (None           ) -> 2013/04/01 15:00:30 -05:00
2013-04-01T15:00:30.1234567-05:00   (AssumeLocal    ) -> 2013/04/01 15:00:30 -05:00
2013-04-01T15:00:30.1234567-05:00   (AssumeUniversal) -> 2013/04/01 15:00:30 -05:00

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。